2009-08-17 12 views
7

BackgroundWorker का उद्देश्य क्या है? threads का उपयोग करकेBackgroundWorker का उद्देश्य क्या है? (क्या मुझे समझने के लिए कुछ नमूना कोड मिल सकता है?)

धन्यवाद की अग्रिम

+3

मूल विचार यह है कि आप पहले चारों ओर बैठते हैं, कुछ और कोशिश करते हैं, यदि आप अटक जाते हैं, तो आप यहां कुछ प्रश्नों सहित एक प्रश्न पूछते हैं। –

+2

मेरा मानना ​​है कि स्टैक ओवरफ्लो के बिंदुओं में से एक "निश्चित Google खोज उत्तर" होना है। भले ही इस प्रश्न का उत्तर दस्तावेज को समझकर प्राप्त किया जा सके, और सवाल कुछ और विवरणों के साथ phrased किया जा सकता था, मैं व्यक्तिगत रूप से इस तरह के प्रश्नों को ध्यान में रखकर नहीं मानता, क्योंकि आपको जवाब मिलते हैं "मैं इसका उपयोग करता हूं निम्नलिखित .. ", जो सादे दस्तावेज़ीकरण से अधिक मूल्यवान है। – alps123

+0

आल्प्स, मैं सहमत हूं, लेकिन सवाल "कॉपी/पेस्ट करने के लिए कुछ दें" के बिना बहुत बेहतर होगा। –

उत्तर

1

यह पृष्ठभूमि में काम करता है (i कुछ नमूना कोड को समझने के लिए मिल सकता है?)।

1

काम करने के लिए ... पृष्ठभूमि में? :)

MSDN से:

BackgroundWorker वर्ग आप एक अलग, समर्पित धागे पर एक ऑपरेशन को चलाने के लिए अनुमति देता है। समय लेने वाली डाउनलोड और डेटाबेस जैसे ऑपरेशन लेन-देन आपके उपयोगकर्ता इंटरफ़ेस (UI) को ऐसा लगता है कि ने चल रहे हैं, जबकि प्रतिक्रिया देना बंद कर दिया है। जब आप एक उत्तरदायी यूआई चाहते हैं और आपको ऐसे परिचालनों से जुड़े लंबी देरी का सामना करना पड़ रहा है, तो पृष्ठभूमिवर्कर वर्ग सुविधाजनक समाधान प्रदान करता है।

The same page का भी एक विस्तृत उदाहरण है। Here एक और सभ्य ट्यूटोरियल है।

22

बैकग्राउंड वर्कर थ्रेड पृष्ठभूमि में लंबे समय तक चलने वाले फ़ंक्शन कॉल को ऑफ़लोड करने में मदद करने के लिए है ताकि इंटरफ़ेस स्थिर न हो।

मान लें कि आपके पास एक बटन क्लिक करने पर गणना करने के लिए 5 सेकंड लगते हैं। उस समय के दौरान, इंटरफेस 'जमे हुए' दिखाई देगा: आप इसके साथ बातचीत करने में सक्षम नहीं होंगे।

यदि आपने इसके बजाय पृष्ठभूमि कार्यकर्ता धागा का उपयोग किया है, तो बटन ईवेंट कार्यकर्ता धागा सेट करेगा और तत्काल वापस लौटाएगा। इससे इंटरफेस को अन्य बटन क्लिक जैसे नए कार्यक्रमों को स्वीकार करने की अनुमति मिल जाएगी।

जहाँ तक कोड के रूप में यहाँ 2 उदाहरण हैं:

यहां इंटरफ़ेस

protected void OnClick(object sender, EventArgs e) 
{ 
    CallLongRunningFunction(); // will take 5 seconds 
} 

यहाँ, यह नहीं के रूप में OnClick तुरंत वापस आ जाएगी जाएगा फ़्रीज़ हो जाएगी और लंबी चलने समारोह निष्पादित किया जाएगा एक और धागे में।

protected void OnClick(object sender, EventArgs e) 
{ 
    BackgroundWorker bg = new BackgroundWorker(); 
    bg.DoWork += new DoWorkEventHandler(bg_DoWork); 
    bg.RunWorkerAsync(); 
} 

void bg_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 
    CallLongRunningFunction(); // will take 5 secs 
} 

व्यवहार में अंतर क्योंकि पृष्ठभूमि कार्यकर्ता धागा करने के लिए कॉल इंटरफेस के रूप में ही धागे में निष्पादित नहीं होगा, यह मुक्त कराने के अपने सामान्य काम जारी रखने के लिए है।

+0

"उद्देश्य क्या है" के निकटतम –

+0

पृष्ठभूमिवर्कर का उपयोग करते समय, सुनिश्चित करें कि आप बटन को दबाए गए दृश्य प्रतिक्रिया दें। पृष्ठभूमि बटन की प्रगति दिखाने के लिए यह बटन का एक सरल अक्षम/सक्षम हो सकता है और/या OnProgress ईवेंट हैंडलर का उपयोग कर सकता है। यह भी ध्यान रखें कि आपके कोड को थ्रेड सुरक्षित होना चाहिए (देखें http://www.c-sharpcorner.com/UploadFile/mgold/MultithreadingIntro10062005000439AM/MultithreadingIntro.aspx?ArticleID=920ecafc-e83b-4a9c-a64d-0b39ad885705)। – Ronald

1

पृष्ठभूमिवर्कर वर्ग का उद्देश्य आपको एक अलग थ्रेड पर संचालन चलाने का एक आसान तरीका प्रदान करना है।

यह धागा निर्माण और निगरानी प्रक्रिया एब्सट्रैक्ट, आप आपरेशन (ProgressChanged) की प्रगति की रिपोर्ट और जब आपका आपरेशन समाप्त हो गया है निर्धारित करने के लिए (RunWorkerCompleted) एक घटना संचालित एपीआई दे रही है ..

बहुत उपयोगी है जब आप समय लेने वाले कार्यों को चलाने की आवश्यकता है जो यूआई को उत्तरदायी नहीं लग सकते हैं।

2

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

हालांकि पृष्ठभूमिवर्कर आपके लिए थ्रेडिंग प्रक्रिया को सरल बनाकर एक कदम आगे चला जाता है। यदि आप भारी या लंबी प्रक्रिया चलाने के लिए अपना खुद का धागा बनाना चाहते हैं तो उदाहरण के लिए प्रगति पट्टी को अपडेट करने के लिए आपको यूआई थ्रेड तक पहुंचने के लिए प्रतिनिधियों का उपयोग करना होगा। पृष्ठभूमिवर्कर आपको किसी भी प्रतिनिधि की आवश्यकता नहीं है क्योंकि पृष्ठभूमिवर्कर का प्रगति चेंज ईवेंट पहले ही यूआई थ्रेड पर चलता है और आप वहां अपना यूआई अपडेटिंग कोड जोड़ सकते हैं।

BackgroundWorker शुरू करने के लिए आप RunWorkerAsync (कॉल करने की आवश्यकता):

this.backgroundWorker.RunWorkerAsync(); 

मैन्युअल रूप से इसे CancelAsync() फोन को रोकने के लिए ...

this.backgroundWorker.CancelAsync(); 

और फिर जाँच रद्दीकरणDoWor के भीतर से संपत्ति घटना k के रूप में नीचे दिखाए गए उदाहरण:

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // Example heavy operation 
    for (int i = 0; i <= 999999; i++) 
    { 
     // Sleep for 10ms to simulate work 
     System.Threading.Thread.Sleep(10); 

     // Report the progress now 
     this.backgroundWorker.ReportProgress(i); 

     // Cancel process if it was flagged to be stopped. 
     if (this.backgroundWorker.CancellationPending) 
     { 
      e.Cancel = true; 
      return; 
     } 
    } 
} 

मैं कैसे अपने ब्लॉग पर BackgroundWorker का उपयोग करने के बारे में एक लेख लिखा था। आप इसे यहां देख सकते हैं: Using the BackgroundWorker Component in C#

संबंधित मुद्दे