[C#] ما هو الفرق بين المهمة وموضوع؟


Answers

في مصطلحات علوم الكمبيوتر ، Task هي مستقبل أو وعد . (بعض الناس يستخدمون هذين المصطلحين بشكل متبادل ، وبعضهم يستخدمونه بشكل مختلف ، ولا يمكن لأحد أن يتفق على تعريف دقيق ). بشكل أساسي ، فإن Task<T> "تعد" بإعادتك T ، ولكن ليس الآن يا عزيزي ، أنا مشغول نوعًا ما لماذا لا تعود لاحقاً؟

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

على وجه الخصوص ، لا تقول Task لماذا يستغرق الأمر وقتًا طويلاً لإعادة القيمة. قد يستغرق الأمر وقتًا طويلاً للحساب ، أو ربما يستغرق الأمر وقتًا طويلاً حتى يجلب. فقط في الحالة السابقة سوف تستخدم مؤشر Thread لتشغيل Task . (في .NET ، مؤشرات الترابط تكون باهظة الثمن ، لذلك أنت تريد عادة تجنبها قدر الإمكان وحقاً تستخدمها فقط إذا كنت ترغب في تشغيل حسابات ثقيلة متعددة على وحدات المعالجة المركزية المتعددة. على سبيل المثال ، في Windows ، يزن الخيط 12 KiByte ( أعتقد) ، في لينكس ، يزن الخيط 4 كيلوبايت فقط ، في Erlang / BEAM حتى 400 بايت فقط. في .NET ، هو 1 ميجايت!)

Question

في C # 4.0 ، لدينا Task في مساحة الاسم System.Threading.Tasks . ما هو الفرق الحقيقي بين Thread Task . فعلت بعض برنامج عينة (مساعدة مأخوذة من MSDN) لمصلحتي للتعلم مع

Parallel.Invoke 
Parallel.For 
Parallel.ForEach 

ولكن لديك الكثير من الشكوك حيث أن الفكرة ليست واضحة.

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




يمكنك استخدام Task لتحديد ما تريد القيام به ثم إرفاق هذه Task مع مؤشر Thread . بحيث يتم تنفيذ Task في مؤشر الترابط الذي تم إنشاؤه حديثًا بدلاً من مؤشر ترابط واجهة المستخدم الرسومية.

استخدم Task مع TaskFactory.StartNew(Action action) . في هذا المكان ، يمكنك تنفيذ تفويض حتى إذا لم تستخدم أي مؤشر ترابط سيتم تنفيذه في نفس سلسلة المحادثات (مؤشر ترابط واجهة المستخدم الرسومية). إذا ذكرت سلسلة رسائل ، يمكنك تنفيذ هذه Task في سلسلة محادثات مختلفة. هذا هو سبب عمل لا لزوم لها يمكنك مباشرة تنفيذ المفوض أو إرفاق ذلك المفوض إلى مؤشر ترابط وتنفيذ ذلك المفوض في هذا الموضوع. لذلك لا تستخدمها. انها فقط غير ضرورية. إذا كنت تنوي تحسين برامجك ، فهذا مرشح جيد يجب إزالته.

** يرجى ملاحظة أن Action هو delegate .




سيعطيك مقطعان الفيديو التاليان من القناة 9 فهمًا أفضل للمهام والخيوط وأين يجب أن نستخدمها.

http://channel9.msdn.com/blogs/bruceky/how-to-parallelize-your-application-part-2-theads-v-tasks http://channel9.msdn.com/blogs/bruceky/how-to-parallelize-your-application-part-3-using-tasks

وإذا كان لديك المزيد من الوقت ، فابدأ بهذا الفيديو

http://channel9.msdn.com/blogs/bruceky/how-to-parallelize-your-application-part-1-why-do-it




بالإضافة إلى النقاط المذكورة أعلاه ، سيكون من الجيد معرفة ما يلي:

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