كيف أفهم التعليمات البرمجية غير المتزامنة؟

مرحبا هبر! أقدم انتباهكم إلى الترجمة (مع تصحيحات طفيفة) لمقالة "كيف أفكر في Async Code؟!" بواسطة ليزلي ريتشاردسون.



أصبحت التعليمات البرمجية غير المتزامنة أكثر شيوعًا لكتابة التطبيقات سريعة الاستجابة. لسوء الحظ ، تقدم البرمجة غير المتزامنة أيضًا صعوبات إضافية. نتيجة لذلك ، يمكن أن يكون فهم كيفية عمل هذا الرمز مهمة شاقة ، بغض النظر عن تجربتك. إذا كنت بدأت للتو في استخدام التعليمات البرمجية غير المتزامنة ، أو تريد تحسين فهمك ، فهذه مقدمة لعالم البرمجة غير المتزامنة!



ما هو الكود غير المتزامن؟



تتيح لك البرمجة غير المتزامنة تنفيذ كتلة من التعليمات البرمجية دون إيقاف (أو حظر) سلسلة الرسائل بالكامل التي يتم تنفيذ الإجراء فيها. من الأسطورة الشائعة حول الشفرة غير المتزامنة أنها تحسن الأداء ، وهذا ليس صحيحًا دائمًا. بدلاً من ذلك ، فإن الميزة الرئيسية للبرمجة غير المتزامنة هي أنها تزيد من عدد المهام (الإنتاجية) التي يمكن تنفيذها بشكل متزامن ، دون الحاجة إلى حظر الخيط الذي يتم تنفيذ هذه الإجراءات فيه.



قد تعتقد أن الشفرة غير المتزامنة تشبه إلى حد كبير الكود متعدد مؤشرات الترابط ، بعد كل شيء ، يمكن تنفيذ العديد من الطرق في وقت واحد في كلتا الحالتين. في الواقع ، يمكن استخدام البرمجة غير المتزامنة مع كل من التطبيقات ذات الخيوط الواحدة والمتعددة. هذا يعني أنه يمكن أن يكون لديك برنامج غير متزامن ذي مؤشر ترابط واحد يمكن من خلاله تشغيل سلسلة واحدة مهام متوازية. على العكس من ذلك ، يمكنك أيضًا الحصول على تطبيق غير متزامن متعدد الخيوط حيث يمكن لخيوط متعددة تشغيل مهام متوازية متعددة.



لماذا يجب علي استخدام كود غير متزامن؟ مثال من فضلك!



للحصول على بعض التشابه لإثبات البرمجة غير المتزامنة ، ضع في اعتبارك عملية خبز الفطيرة. سيتم تمثيل هذه العملية بواسطة مؤشر ترابط يقوم بعدة خطوات (أو مهام) ، كما هو موضح في الكود أدناه. هذا الرمز صحيح ولا يزال لديك كعكة لذيذة بعد تنفيذ الطريقة. ومع ذلك ، نظرًا لأن جميع الشفرات متزامنة ، فسيتم تنفيذ كل سطر بالتتابع. بمعنى آخر ، ستقف ثابتًا تمامًا أثناء انتظار انتهاء الفرن من التسخين المسبق. لكن في نفس الوقت ، يمكنك صنع عجينة لفطيرتك!



() MakeCake المتزامن الطريقة:



صورة



برنامج خبز الكيك المتزامن



صورة



في الحياة الواقعية ، تميل إلى تقسيم هذه العملية إلى مهام ، عجن العجين أثناء تسخين الفرن. أو اصنعي كريمة التزيين أثناء خبز الكيك في الفرن. هذا يزيد من إنتاجيتك ويسمح لك بخبز الكيك بشكل أسرع. هذا هو المكان الذي يكون فيه الرمز غير المتزامن مفيدًا! من خلال جعل الكود الحالي غير متزامن ، يمكننا القيام بأشياء أخرى لتمضية الوقت بينما ننتظر نتيجة مهمة ، مثل خبز فطيرة في الفرن.

للقيام بذلك ، سنقوم بتغيير الكود الخاص بنا ، وكذلك إضافة طريقة PassTheTime . الآن ، يحفظ الكود الخاص بنا حالة المهمة ، ويبدأ عملية أخرى متزامنة أو غير متزامنة ، ويحصل على نتيجة المهمة المحفوظة عند الحاجة.



طريقة MakeCake ()

صورة



غير المتزامنة برنامج خبز الفطيرة غير المتزامن

صورة



بالمقارنة مع طريقة MakeCake المتزامنة ، والتي تفتقر إلى طريقة PassTheTime ، يمكن لطريقة MakeCakeAsync غير المتزامنة إكمال المزيد من المهام دون حظر الخيط ، مما يقلل الوقت المستغرق لإكمال الطريقة بأكملها.



مقارنة البرامج غير المتزامنة والمتزامنة



صورة



كيف أكتب تعليمة برمجية غير متزامنة في .NET؟



C # يسمح لك لكتابة التعليمات البرمجية غير متزامن باستخدام المهام نوع و ننتظر و المتزامن الكلمات الرئيسية . يقوم نوع المهمة بإعلام المتصل بنوع إرجاع محتمل. كما يشير أيضًا إلى أنه يمكن الاستمرار في تنفيذ إجراءات أخرى في طريقة الاستدعاء. و الكلمة المتزامن يقترن مع انتظار الكلمة ، والتي تبلغ المترجم أننا بحاجة إلى قيمة الإرجاع من الأسلوب، ولكن ليس على الفور. نتيجة لذلك ، لا نحتاج إلى حظر مؤشر ترابط الاستدعاء ، ويمكننا الاستمرار في أداء المهام الأخرى حتى تكون القيمة المتوقعة مطلوبة. في البداية سيتم تنفيذ الطريقة غير المتزامنة بشكل متزامن حتى يتم العثور على انتظار الكلمة الأساسية... هذه هي اللحظة التي يبدأ فيها تنفيذ الطريقة بشكل غير متزامن.



تعلمت عن الكود غير المتزامن! ماذا الآن؟



في حين أن تطبيق خبز الكيك غير المتزامن رائع ، إلا أن هناك العديد من تطبيقات العالم الحقيقي الأخرى التي تستخدم كودًا غير متزامن أيضًا. المثالان الأكثر شيوعًا هما:



التطبيقات التي تستخدم طلبات HTTP - اعتمادًا على الطلب ، يمكن أن تستغرق مكالمات HTTP وقتًا طويلاً للمعالجة. يتيح لنا استخدام التعليمات البرمجية غير المتزامنة إجراء عمليات أخرى أثناء انتظار استجابة من الخادم.



مثال طلب HTTP GET



صورة



تطبيقات واجهة المستخدم - تعد تطبيقات WPF أو أي تطبيقات أخرى تستخدم الأزرار ومربعات النص وموارد UX الأخرى رائعة أيضًا للتنفيذ غير المتزامن. على سبيل المثال ، تطبيق WPF يوزع ملفًا. قد يستغرق هذا الإجراء بعض الوقت. ومع ذلك ، بجعل هذا الإجراء غير متزامن ، لا يزال بإمكانك التفاعل مع واجهة المستخدم دون إيقاف التطبيق تمامًا أثناء انتظار اكتمال العملية.



All Articles