2010-02-13 20 views
5

मल्टीथ्रेडिंग WPF अनुप्रयोगों को बनाने के लिए सीखना मैंने पृष्ठभूमिवर्कर का उपयोग करने में कुछ प्रतिबंधों के बारे में पढ़ा जो मेरे लिए बहुत स्पष्ट नहीं था। कृपया, मुझे समझने में मदद करें:क्या पृष्ठभूमिवर्कर वास्तविक मल्टीथ्रेडिंग प्रदान करता है?

यदि मैं यूआई के दृश्य के पीछे काम करने वाला केवल एक धागा नहीं चाहता हूं, लेकिन हो सकता है कि कई लोग स्वतंत्र रूप से एक दूसरे से शुरू और समाप्त हो जाएं, क्या पृष्ठभूमिवर्कर ऐसे मामले में फिट होगा? क्या मेरे पास BackgroundWorker के कई उदाहरण हो सकते हैं?

बस शब्दों में कहें, क्या पृष्ठभूमिवर्कर एक बहु-थ्रेडिंग प्रदान करता है न कि केवल दो-थ्रेडिंग?

+0

क्या आपके पास उन प्रतिबंधों का लिंक है जिनके बारे में आप पढ़ते हैं? –

+0

@ मार्क बियर उदाहरण के लिए इस पैराग्राफ ("प्रो डब्ल्यूपीएफ इन सी # 2008" मैथ्यू मैकडॉनल्ड्स द्वारा पुस्तक): "नोट: बैकग्राउंड वर्कर सही है यदि आपके पास एक एकल असीमित कार्य है जो पृष्ठभूमि से शुरू होने से शुरू होता है (वैकल्पिक के साथ प्रगति रिपोर्टिंग और रद्दीकरण के लिए समर्थन)। यदि आपके मन में कुछ और है- उदाहरण के लिए, एक असीमित कार्य जो आपके आवेदन के पूरे जीवन में चलता है या एक असीमित कार्य जो आपके आवेदन के साथ संवाद करता है, जबकि यह आपके काम करता है, आपको इसकी आवश्यकता होगी .NET के थ्रेडिंग समर्थन का उपयोग करके एक अनुकूलित समाधान तैयार करने के लिए। " – rem

+1

मुझे लगता है कि यह तकनीकी रूप से संभव है कि तुलना में अच्छा डिजाइन के रूप में माना जाता है के बारे में एक सवाल है। आप * कई पृष्ठभूमि कार्यकर्ता बना सकते हैं, लेकिन हो सकता है कि यह आपकी समस्या का समाधान करने का सबसे अच्छा तरीका न हो। –

उत्तर

11

प्रत्येक BackgroundWorker एक अलग धागे पर चलता है। आप कई पृष्ठभूमि कार्यकर्ता बना सकते हैं क्योंकि आपको समानांतर में संचालन चलाने की आवश्यकता है, इसलिए उस अर्थ में यह सच बहुसंख्यक है।

BackgroundWorker का लाभ वह सुविधा है जिसके साथ आप उन घटनाओं की सदस्यता ले सकते हैं जो आपके यूआई थ्रेड पर आग लगेंगे जब समय लेने वाला कार्य पूरा हो जाएगा।

BackgroundWorker वास्तव में काफी सरल का उपयोग किया जाता है:

var worker1 = new System.ComponentModel.BackgroundWorker(); 
worker1.DoWork += (sender,e) => Thread.Sleep(10000); 
worker1.RunWorkerCompleted += (sender,e) => MessageBox.Show("Worker1 Finished!"); 
worker1.RunWorkerAsync(); 
2

आप कई BackgroundWorker उदाहरण बना है तो आप कई सूत्र मिलता है, एक उदाहरण केवल एक ही पृष्ठभूमि कार्य तथापि के लिए प्रदान करता है।

3

आपके द्वारा उद्धृत किए गए प्रतिबंध (प्रो डब्ल्यूपीएफ से) तथ्य यह है कि एक बीजीडब्ल्यू थ्रेडपूल का उपयोग करता है, इसलिए थ्रेडपूल धागे के संबंध में सभी rules and adivice लागू होते हैं।

+0

उपयोगी जानकारी और लिंक +1 के लिए धन्यवाद – rem

0

हां, आंतरिक रूप से, पृष्ठभूमि कार्यकर्ता आपको BeginInvoke पर कॉल करता है, आपको प्रतिनिधि प्रदान किया जाता है। इसके परिणामस्वरूप आपका प्रतिनिधि सीएलआर में थ्रेड पूल पर रखा जा रहा है।