البرمجة

فهم استخدام Task.Run مع async/await

في البداية، دعني أوضح لك فائدة استخدام Task.Run مع async/await في لغة C#. عندما تقوم بإنشاء مهمة باستخدام Task.Run، يتم تشغيل الكود داخل مهمة جديدة بطريقة متوازية (asynchronously). وعندما تستخدم async/await معا، فإنك تتمكن من تشغيل الأكواد بطريقة متوازية دون تأثير سلبي على الأداء أو استخدام الذاكرة الزائد.

الشيء المثير للتساؤل في الكود الذي قدمته يكمن في استخدام دمج Task.Run مع Wait()، والذي قد يبدو مضللاً في بعض الأحيان.

لنفهم هذا الكود بشكل أفضل، دعنا نقوم بتحليله خطوة بخطوة:

  1. Task.Run(async () => { await SomeClass.Initiate(new Configuration()); }): هذا الجزء يبدأ بإنشاء مهمة جديدة تستدعي الدالة المسماة Initiate() في SomeClass، والتي يبدو أنها تقوم بإعداد بعض الإعدادات باستخدام Configuration().

  2. .Wait(): هنا، يتم استدعاء الدالة Wait()، وهي تقفل تنفيذ الكود حتى تنتهي المهمة التي تم إطلاقها باستخدام Task.Run. وهذا يعني أن البرنامج لن يتقدم للسطر التالي حتى ينتهي تنفيذ المهمة التي بدأتها Task.Run.

  3. while (true): هذا السطر يقوم بإنشاء حلقة لانهائية (infinite loop)، والتي ببساطة تبقي البرنامج يعمل دائماً دون نهاية.

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

لذا، يمكنك تحسين الكود بشكل كبير من خلال إزالة استخدام .Wait() وبالتالي السماح للتنفيذ بالمرور إلى الحلقة اللانهائية مباشرة بعد بدء تنفيذ المهمة. وهذا سيجعل التطبيق يستفيد بشكل أفضل من الأداء الذي يوفره async/await و Task.Run.

المزيد من المعلومات

تحسين الكود يتطلب فهمًا أعمق لكيفية عمل async/await و Task.Run. عند استخدام async/await، يتم تشغيل الكود الذي يحتوي على await بطريقة متوازية، مما يسمح للتطبيق بالاستمرار في العمل والاستجابة للأحداث الأخرى أثناء انتظار العملية الطويلة للاكتمال. وعند استخدام Task.Run، يتم تشغيل الكود في مهمة منفصلة عن المهمة الرئيسية للتطبيق، مما يسمح بتنفيذه بشكل متوازٍ.

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

لذا، بعد التعديل، سيبدو الكود كما يلي:

csharp
static async Task Main(string[] args) { await Task.Run(async () => { await SomeClass.Initiate(new Configuration()); }); while (true) ; }

الآن، يتم تنفيذ المهمة بشكل متوازٍ دون تعليق البرنامج عند نقطة .Wait()، مما يجعل التطبيق أكثر استجابة وأكثر فعالية من حيث الأداء.

في النهاية، فهم كيفية استخدام Task.Run مع async/await بشكل صحيح يساعد على تحسين أداء التطبيقات وجعلها أكثر استجابة وفعالية.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر