2010-05-10 15 views
25

मेरा सी # एप्लिकेशन में कई पृष्ठभूमि कर्मचारी हैं। कभी-कभी एक पृष्ठभूमि कार्यकर्ता दूसरे को आग लगा देगा। जब पहला पृष्ठभूमि कार्यकर्ता पूरा हो जाता है और RunWorkerCompleted ईवेंट निकाल दिया जाता है, तो उस घटना पर कौन सा धागा आग लग जाएगा, यूआई या पहला पृष्ठभूमि कार्यकर्ता जिस से RunWorkerAsync कहा जाता था? मैं माइक्रोसॉफ्ट विजुअल सी # 2008 एक्सप्रेस संस्करण का उपयोग कर रहा हूं। आपके विचारों या सुझावों की सराहना की जाएगी। धन्यवाद।BackgroundWorker RunWorker पूर्ण घटना

उत्तर

57

यदि BackgroundWorker UI थ्रेड से बनाया गया था, तो RunWorkerCompleted ईवेंट UI थ्रेड पर भी उठाया जाएगा।

यदि यह पृष्ठभूमि थ्रेड से बनाया गया था, तो ईवेंट एक अपरिभाषित पृष्ठभूमि थ्रेड पर उठाया जाएगा (जरूरी नहीं कि एक ही धागा, जब तक कि आप कस्टम SynchronizationContext का उपयोग नहीं कर रहे हों)।

दिलचस्प बात यह है कि यह एमएसडीएन पर अच्छी तरह से प्रलेखित नहीं है। सबसे अच्छा संदर्भ मैं ढूँढने में सक्षम था here था:

अपने आवेदन में बहु सूत्रण लागू करने के लिए पसंदीदा तरीका BackgroundWorker घटक का उपयोग करने के लिए है। BackgroundWorker घटक मल्टीथ्रेडिंग के लिए इवेंट-संचालित मॉडल का उपयोग करता है। पृष्ठभूमि धागा आपके DoWork इवेंट हैंडलर चलाता है, और आपके नियंत्रण को बनाने वाला थ्रेड आपके ProgressChanged और RunWorkerCompleted ईवेंट हैंडलर चलाता है। आप अपने नियंत्रण अपने ProgressChanged और RunWorkerCompleted ईवेंट हैंडलर से कॉल कर सकते हैं।

+0

क्या यह नियंत्रण होगा जहां नियंत्रण तत्काल था? मेरे सभी पृष्ठभूमि कार्यकर्ताओं को यूआई थ्रेड से डिफ़ॉल्ट 'InitializeComponent()' फ़ंक्शन में तत्काल (संभवतः) तत्काल किया जाता है। –

+0

@Jim: हां, मूल लेने पर थोड़ा खराब शब्द; यह वास्तव में वह थ्रेड है जिसने 'BackgroundWorker' बनाया है जो ईवेंट प्राप्त करेगा, और आपको उसी थ्रेड से' RunWorkerAsync' को कॉल करना होगा। स्वच्छता उद्देश्यों के लिए, आमतौर पर यूआई थ्रेड होना चाहिए। – Aaronaught

+8

यह सही नहीं है। यदि यूआई थ्रेड ने बीजीडब्ल्यू इंस्टेंस बनाया है तो यह केवल यूआई थ्रेड पर उठाया जाएगा। यदि एक धागे ने बीजीडब्ल्यू बनाया तो यह एक मनमाने ढंग से थ्रेडपूल धागे पर उठाया जाएगा। –