كيفية إحباط المواضيع التي تم إنشاؤها باستخدام ThreadPool.QueueUserWorkItem

StackOverflow https://stackoverflow.com/questions/26816

  •  09-06-2019
  •  | 
  •  

سؤال

هل هناك طريقة لإحباط المواضيع التي تم إنشاؤها باستخدام QueueUserWorkItem؟

أو ربما لا أحتاج إلى ذلك؟ماذا يحدث إذا خرج التطبيق الرئيسي؟هل تم إحباط كل المواضيع التي تم إنشاؤها منه تلقائيًا؟

هل كانت مفيدة؟

المحلول

لا تحتاج إلى إجهاضهم.عند إنهاء التطبيق الخاص بك، سيقوم .NET بإنهاء أي سلاسل رسائل بها IsBackground = true.تم تعيين جميع سلاسل الرسائل الخاصة بـ .NET على IsBackground = true، لذلك لا داعي للقلق بشأن ذلك.

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

نصائح أخرى

ومع ذلك ، إذا كنت تستخدم موارد غير مُدارة في هذه المواضيع ، فقد ينتهي بك الأمر في الكثير من المتاعب.

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

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

يستخدم Threadpool مؤشرات الترابط الخلفية.ومن ثم، سيتم إغلاقها جميعًا تلقائيًا عند خروج التطبيق.

إذا كنت تريد إلغاء سلسلة رسائل بنفسك، فسيتعين عليك إما إدارة سلسلة الرسائل بنفسك (حتى تتمكن من استدعاء Thread.Abort() على كائن سلسلة الرسائل) أو سيتعين عليك إعداد شكل ما من أشكال آلية الإشعارات التي ستتيح لك أخبر الخيط أنه يجب أن يجهض نفسه.

نعم هم سوف.ومع ذلك، إذا كنت تستخدم موارد غير مُدارة في تلك المواضيع، فقد ينتهي بك الأمر إلى الكثير من المتاعب.

نعم، إنها خلفية، ولكن f.ex إذا كان لديك تطبيق تستخدم فيه ThreadPool لبعض التنزيلات أو الأشياء المتعددة نوعًا ما، وتريد إيقافها، فكيف تتوقف؟اقتراحي سيكون:الخروج من الموضوع في أسرع وقت ممكن، f.ex

bool stop = false;
void doDownloadWork(object s) 
{
   if (!stop)
   {
       DownloadLink((String)s, location);
   }
}

وإذا قمت بتعيين stop = true، فإن سلاسل الرسائل الثانية (الموجودة حاليًا في قائمة الانتظار) تخرج تلقائيًا، بعد انتهاء سلاسل قائمة الانتظار من معالجتها.

بحسب إجابة Lukas Šalkauskas.

ولكن يجب عليك استخدام:

volatile bool stop = false;

لإخبار المترجم بأن هذا المتغير يستخدم بواسطة عدة سلاسل رسائل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top