[C#] متى للتخلص من كانسلاستوكنسورس؟


Answers

أخذت نظرة في إلسبي ل كانسلاتوكنسورس ولكن يمكنني فقط العثور على m_KernelEvent الذي هو في الواقع مانوالريزيتيفنت، وهو فئة المجمع لكائن ويثاندل. وینبغي التعامل مع ھذا بشکل صحیح من قبل غ.

Question

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

من ناحية أخرى إذا نظرتم إلى عينات على مقالة إلغاء مسن كل مقتطفات التعليمات البرمجية لا تفعل ذلك باستثناء واحد.

يبدو أن من الصعب العثور على المكان الصحيح والوقت للقيام بذلك في التعليمات البرمجية.

  1. لا يمكنك التفاف رمز بدء المهمة المتوازية مع using إذا كنت لا تنتظر لذلك. ومن المنطقي أن يكون الإلغاء إلا إذا كنت لا تنتظر.
  2. بالطبع يمكنك إضافة ContinueWith على المهمة مع دعوة Dispose ، ولكن هو أن الطريق للذهاب؟
  3. ماذا عن استعلامات بلينك القابلة للإلغاء، والتي لا تزامن مرة أخرى، ولكن فقط تفعل شيئا في نهاية المطاف؟ لنفترض. .ForAll(x => Console.Write(x)) ؟
  4. هل يمكن إعادة استخدامها؟ هل يمكننا إعادة استخدام الرمز المميز نفسه لعدة مكالمات ثم التخلص منها مع المكون المضيف، دعنا نقول التحكم في واجهة المستخدم؟

لأنه ليس لديها شيء مثل طريقة Reset لتنظيف IsCancelRequested و حقل Token افترض أنه غير قابلة لإعادة الاستخدام، وبالتالي في كل مرة تقوم فيها بتشغيل مهمة (أو استعلام بلينق) يجب إنشاء واحدة جديدة. هل صحيح؟ إذا كان الجواب نعم، سؤالي هو ما هي الاستراتيجية الصحيحة والموصى بها للتعامل مع Dispose على تلك الحالات CancellationTokenSource كثيرة؟




يجب دائما التخلص من CancellationTokenSource .

كيفية التخلص منه يعتمد بالضبط على السيناريو. تقترح عدة سيناريوهات مختلفة.

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

  2. عند استخدام المهام، استخدم مهمة ContinueWith كما أوضحت للتخلص من CancellationTOkenSource .

  3. ل بلينق يمكنك استخدام using منذ كنت تشغيله في موازاة ولكن في انتظار على كل من العاملين على التوالي موازية لإنهاء.

  4. بالنسبة إلى واجهة المستخدم، يمكنك إنشاء CancellationTokenSource جديد كل عملية قابلة للإلغاء غير مرتبطة بإلغاء تشغيل واحد. الحفاظ على List<IDisposable> وإضافة كل مصدر إلى القائمة، والتخلص منها جميعا عند التخلص من المكون الخاص بك.

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

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




إنشاء تطبيق نماذج ويندوز جديد من قالب المشروع. إسقاط زر على النموذج وانقر نقرا مزدوجا فوقه. اجعلها تبدو كما يلي:

    private void button1_Click(object sender, EventArgs e) {
        var t = new System.Threading.Thread(() => { });
        t.Start();
    }

اضغط على كترل + F5 لبدء تشغيله. ابدأ + تشغيل، TaskMgr.exe، وعلامات التبويب العمليات. عرض + حدد الأعمدة ووضع علامة "مقابض". لاحظ قيمة هذا العمود لعملية WindowsFormsApplication1.exe أثناء النقر فوق الزر بشكل متكرر.

فئة الموضوع لا يحتوي على أسلوب ديسبوس ().

دعونا نعمل من افتراض أن لديها واحدة. متى تسميته؟

اقرأ المزيد عن الحكمة من محاولة التخلص من الأشياء التي يصعب التخلص منها في هذا بلوق وظيفة ستيفن توب.