मेरे पास पृष्ठभूमि थ्रेड कार्यान्वयन की पसंद के बारे में एक स्टाइलिस्ट सवाल है, मुझे विंडोज़ फॉर्म ऐप पर उपयोग करना चाहिए। वर्तमान में मेरे पास BackgroundWorker
एक ऐसे फॉर्म पर है जिसमें अनंत (while(true))
लूप है। इस लूप में मैं रुचि के कुछ होने तक थ्रेड स्नूज़िंग रखने के लिए WaitHandle.WaitAny
का उपयोग करता हूं। इवेंट हैंडल में से एक मैं प्रतीक्षा करता हूं "StopThread
" ईवेंट ताकि मैं लूप से बाहर निकल सकूं। इस घटना को संकेत दिया गया है जब मेरे ओवरराइड Form.Dispose()
से।पृष्ठभूमिवर्कर बनाम पृष्ठभूमि थ्रेड
मैंने कहीं पढ़ा है कि BackgroundWorker
वास्तव में उन परिचालनों के लिए है जो आप यूआई को जोड़ना नहीं चाहते हैं और एक सीमित अंत है - जैसे फाइल डाउनलोड करना, या वस्तुओं के अनुक्रम को प्रोसेस करना। इस मामले में "अंत" अज्ञात है और केवल तभी जब खिड़की बंद हो। इसलिए इस उद्देश्य के लिए BackgroundWorker
के बजाय पृष्ठभूमि थ्रेड का उपयोग करना मेरे लिए अधिक उपयुक्त होगा?
एक अन्य समस्या मुझे अनिश्चित है, मान लीजिए कि मैं उस फॉर्म को निपटाने का प्रयास कर रहा हूं जिसमें पृष्ठभूमि कार्यकर्ता चल रहा है। मैं शटडाउनवेंट (मैनुअल रीसेट इवेंट) को सिग्नल करता हूं और उसके बाद कुछ समय बाद DoWork खुशी से बाहर निकल जाएगा।क्या मुझे फॉर्म को आगे बढ़ने देना चाहिए और भले ही DoWork को समाप्त करने में थोड़ा समय लगेगा, या थ्रेड के लिए कुछ रास्ता (और यह बेहतर है) है। पृष्ठभूमि कार्यकर्ता से जुड़ें जब तक कि यह वास्तव में बाहर निकल न जाए और फिर निपटान करें फॉर्म जारी है? –
मुझे लगता है कि BackgroundWorker.IsBusy वह है जो आप वहां देख रहे हैं। – ParmesanCodice
केवल 'रद्द करेंसिंक्स' का उपयोग करें (और 'रद्द करने के लिए परीक्षण' यदि आपका धागा शॉर्ट अंतराल पर मतदान करेगा, यदि आप इसके बजाय अपवाद अपनाना चाहते हैं, तो 'System.Threading.Thread.Abort()' का उपयोग करें जो अपवाद उठाता है थ्रेड ब्लॉक के भीतर, स्थिति के लिए सही मॉडल चुनें। –