2009-05-12 16 views
17

मेरे पास एक पृष्ठभूमि कार्यकर्ता एक लंबा डेटाबेस कार्य चला रहा है। कार्य चल रहा है, जबकि मैं प्रगति पट्टी दिखाना चाहता हूँ। किसी भी तरह पृष्ठभूमि कार्यकर्ता कार्य की प्रगति की रिपोर्ट नहीं करेगा।पृष्ठभूमि कार्यकर्ता प्रगति की रिपोर्ट नहीं करेगा

यह मैं क्या है:

BackgroundWorker _bgwLoadClients; 

_bgwLoadClients = new BackgroundWorker(); 
_bgwLoadClients.WorkerReportsProgress = true; 
_bgwLoadClients.DoWork += new DoWorkEventHandler(_bgwLoadClients_DoWork); 
_bgwLoadClients.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_bgwLoadClients_RunWorkerCompleted); 
_bgwLoadClients.ProgressChanged += new ProgressChangedEventHandler(_bgwLoadClients_ProgressChanged); 
_bgwLoadClients.RunWorkerAsync(parms); 

private void _bgwLoadClients_DoWork(object sender, DoWorkEventArgs e) 
{ 
    DataTable dt = getdate(); 
    e.Result = dt; 
} 

void _bgwLoadClients_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar1.Value = e.ProgressPercentage; 
} 

मैं WPF में यह कर रहा हूं, लेकिन मैं इसे कोई फर्क नहीं होगा लगता है।

अग्रिम

+2

यदि आप अपने प्रश्न टाइप (या संपादन) करते समय चार रिक्त स्थान से अपना कोड इंडेंट करते हैं, तो इसे अनुच्छेद में एक साथ मैश किए गए और पढ़ने के लिए कठिन के बजाय कोड की तरह इंडेंटेशन और स्वरूपण के साथ प्रदर्शित किया जाएगा। –

+0

आप पृष्ठभूमि कार्यकर्ता की रिपोर्ट प्रगति विधि को कॉल नहीं कर रहे हैं - क्या यह केवल इसलिए है क्योंकि आप हमें कुछ सरल कोड दिखा रहे हैं? – Mike

+0

@ माइक, मुझे लगता है कि शायद एक उदाहरण के संपादन के बजाय कारण है। –

उत्तर

30

आपको अपनी DoWork विधि को रिपोर्ट करने योग्य प्रगति में तोड़ने की आवश्यकता है और फिर रिपोर्ट प्रोग्रेस को कॉल करें। उदाहरण के लिए

लें निम्नलिखित:

private void Something_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // If possible, establish how much there is to do 
    int totalSteps = EstablishWorkload(); 

    for (int i=0; i<totalSteps; i++) 
    { 
     // Do something... 

     // Report progress, hint: sender is your worker 
     (sender as BackgroundWorker).ReportProgress((int)(100/totalSteps)*i, null); 
    } 

} 

अपने काम पूर्व निर्धारित नहीं किया जा सकता है, तो स्वयं प्रतिशत जोड़ने का प्रयास करें:

private void Something_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // some work 

    (sender as BackgroundWorker).ReportProgress(25, null); 

    // some work 

    (sender as BackgroundWorker).ReportProgress(50, null); 

    // some work 

    (sender as BackgroundWorker).ReportProgress(60, null); 

    // some work 

    (sender as BackgroundWorker).ReportProgress(99, null); 
} 
+6

अच्छा प्रोग्रामिंग, खराब गणित ;-) (int) (100.0/कुल चरण * i) –

2

धन्यवाद बस dowork घटना

private void _bgwLoadClients_DoWork(object sender, DoWorkEventArgs e) { 
    int progresValue0to100 = 75; 
    (sender as System.ComponentModel.BackgroundWorker).ReportProgress(progresValue0to100); 
    //do your jobs.. 
} 

यह इस

3

आप manualy ProgressChanged घटना को बढ़ाने के लिए कॉल करने के लिए ReportProgress() है की तरह काम करता पर प्रगति की रिपोर्ट।

3

आपको कार्यकर्ता को कॉल करने की आवश्यकता है। अपनी DoWork विधि में रिपोर्ट प्रगति (प्रतिशत पूर्ण)। प्रतिशत कुल काम के आधार पर पूर्ण गणना की जानी चाहिए। उदाहरण के लिए:

for(int i =0; i != 100; i++) { 
    // do something 
    worker.ReportProgress(i); 
} 

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

2

प्रगति को फोन करके DoWork घटना के भीतर से भेजा जाना चाहिए BackgroundWorker पर ReportProgress विधि। आपके मामले में, आप किसी भी प्रगति की रिपोर्ट नहीं कर सकते क्योंकि सभी काम DoWork फ़ंक्शन के बाहर किए जा रहे हैं। आप getdate() पर कॉल के पहले और बाद में केवल प्रगति की रिपोर्ट कर सकते हैं, लेकिन कॉलवर्क के दौरान नहीं, क्योंकि BackgroundWorker थ्रेड व्यस्त है।

9

सच या तो गुण विंडो में या कोड में करने के लिए BackgroundWorker वस्तु की WorkReportProgress संपत्ति को संशोधित करें।

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