[C#] يمكن تشغيل تبل المهمة على أكثر من مؤشر ترابط واحد؟


Answers

سيقوم Task.Run بجدولة المندوب الذي سيتم تنفيذه في تجمع الترابط، وسوف يقوم تجمع ترابط فقط بتنفيذ المفوض المعطى على مؤشر ترابط واحد فقط. فإنه لن تتحرك حولها بين المواضيع.

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

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

public static async Task Foo()
{
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
    await Task.Delay(100);
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
    await Task.Delay(100);
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
}
Question

ورحب مونو / زامارين إجابات محددة.

أنا تشغيل System.Threading.Tasks باستخدام Task.Run (). هل سيقوم تبل بتعيين المهمة التي تم تكوينها الى مؤشر ترابط واحد لحياة تنفيذ المهمة؟ أو هل من الممكن أن المهمة التي تم إنشاؤها سوف تحصل على استباق أثناء التشغيل، ومن ثم جدولة مرة أخرى على مؤشر ترابط مختلف؟

ويل Thread.CurrentThread.ManagedThreadId تكون ثابتة على مدى حياة مهمة؟

هل يختلف الجواب عن المهام الطويلة الأمد؟

هل هناك طريقة للسيطرة على سلوك تبل في هذا الصدد؟