سؤال

وحاولت في الآونة الأخيرة إلى استخدام backgroundworker بدلا من المواضيع "الكلاسيكية" وأنا أن يدركوا أنه يسبب، على الأقل بالنسبة لي، مشاكل أكثر من الحلول. لدي backgroundworker تشغيل قراءة متزامن (في هذه الحالة من منفذ تسلسلي) والحصول على منعت حوالي 30 ثانية في 1 خط الرمز، ثم cancellationpending ليس هو الحل. اراه انه اذا يحصل على إغلاق التطبيق في هذه المرحلة (إما مع زر عبر وApplication.Exit ()) عملية يحتفظ غيبوبة إلى الأبد.

وأنا بحاجة إلى وسيلة لإجبار إحباط أو لقتل موضوع backgroundworker.

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

المحلول

ولست متأكدا جدا على ما كنت تحاول إنجاز، ولكن ربما في SerialPort.DataReceived الحدث هو أفضل حل؟

إذا كنت بالفعل يتقن مع استخدام الخيوط، وأنا لا أرى نقطة في استخدام BackgroundWorker. انها مصممة للأشخاص الذين لا يفهمون المواضيع في المقام الأول.

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

نصائح أخرى

وأضع واحدة معا أن (على ما أظن) لا وظيفة. واسمحوا لي أن أعرف إذا ايم waaaay خارج. هنا هو exaple بسيط كيف يعمل.

var backgroundWorker = new BackgroundWorker(){WorkerSupportsCancellation = true};

backgroundWorker.DoWork += (sender, args) =>
         {                 
                 var thisWorker = sender as BackgroundWorker;
                 var _child = new Thread(() =>
                                               {
                                                   //..Do Some Code

                                               });
                 _child .Start();
                 while (_child.IsAlive)
                 {
                     if (thisWorker.CancellationPending)
                     {
                         _child.Abort();
                         args.Cancel = true;
                     }
                     Thread.SpinWait(1);
                 }                 
         };

 backgroundWorker.RunWorkerAsync(parameter);
 //..Do Something...
backgroundWorker.CancelAsync();

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

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

يجب أن العملية لا تصبح غيبوبة، منذ يتم وضع علامة على موضوع BackgroundWorker باسم "الخلفية" ويجب أن تنتهي عند إغلاق UI.

وأنا لا أعتقد أن BackgroundWorker يدعم القتل في الموضوع. إلغاء عملية يجب القيام به في أسلوب الذي يقوم بهذه المهمة. في حالتك اعتقد ان موضوع العادية يكون الخيار الأفضل.

ويمكنك أن تجرب هذا:

            backgroundworker.Dispose();
            backgroundworker = null;
            GC.Collect(); //this helps cleans up ram
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top