2010-03-22 2 views
7

से प्रगति पट्टी को अपडेट करने के लिए WPF सर्वोत्तम बिंदु मेरे पास एक कार्य है जो निष्पादित करने में लंबा समय लगता है। प्रगति के उपयोगकर्ता को सूचित करने के लिए, मेरे पास प्रगति बार है जो मैं DoWork के अंदर अपडेट करता हूं।BackgroundForker

क्या कोई मुझे बता सकता है कि प्रगति बार अपडेट करने का यह सबसे अच्छा तरीका है? मैंने सुना है कि ReportProgress इवेंट हैंडलर है लेकिन मैं उलझन में हूं क्योंकि मुझे ReportProgress के उद्देश्य से अनिश्चितता है।

उत्तर

0

रिपोर्ट प्रोग्रेस वह है जो आप अपने काम की प्रगति को अपडेट करने के लिए उपयोग करेंगे, जिसमें यूआई जैसी चीजें शामिल हैं - आपके मामले में, एक प्रोजेक्शन बार।

आपको here स्थित एमएसडीएन दस्तावेज़ों को देखना चाहिए।

मूल रूप से, आप ReportProgress घटना के लिए कोई हैंडलर बनानी होगी, फिर DoWorkEventHandler में, तुम इतनी तरह ReportProgress फोन:

worker.ReportProgress((i * 10)); 
+0

ठीक है! धन्यवाद, इसलिए मैं रिपोर्ट प्रोग्रेस को कॉल कर सकता हूं और यह प्रोग्रेस चेंजेड इवेंट बढ़ाएगा क्योंकि मॉरीज़ियो कहते हैं। फिर प्रगति के अंदर बदलें घटना मैं अपने यूआई के किसी भी नियंत्रण को अपडेट कर सकता हूं, उदाहरण के लिए, प्रोग्रेसबार, लेबल, टेक्स्टब्लॉक, ... डिस्पैचर को कॉल करने की आवश्यकता नहीं है। इन्वोक। क्या मैं सही हू? धन्यवाद। – toni

+0

यह सही है! –

0

ProgressChanged घटना आप के लिए क्या देख रहे है। हालांकि, सुनिश्चित करें कि आप पृष्ठभूमि वर्कर को नीचे की तरह बनाते हैं, इसलिए जब वास्तव में रिपोर्ट प्रोग्रेस कहा जाता है तो यह वास्तव में इस घटना को उठाता है।

BackgroundWorker bw = new BackgroundWorker() { WorkerReportsProgress = true }; 
bw.ProgressChanged += ... ; 
10

के बाद से पृष्ठभूमि कार्यकर्ता एक अलग थ्रेड में काम करता है, अगर आप यूआई वस्तुओं तक पहुँचने का प्रयास समस्याएं आ जाएगा। DoWork हैंडलर के अंदर से कार्यकर्ता पर ReportProgress विधि को कॉल करना प्रोग्रेस चेंजेड ईवेंट बढ़ाता है। यूआई थ्रेड में उस घटना को संभाला जाना चाहिए ताकि नियंत्रण को आसानी से एक्सेस किया जा सके।

 BackgroundWorker worker = new BackgroundWorker(); 
     worker.DoWork += DoWorkHandler; 
     worker.WorkerReportsProgress = true; 
     worker.ProgressChanged += (s, e) => 
      { myProgressBar.Value = e.ProgressPercentage; }; 

     worker.RunWorkerAsync(); 

...

public void DoWorkHandler(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 

     while (working) 
     { 
      // Do Stuff 

      worker.ReportProgress(progressPercentage); 
     } 
    }