2012-12-14 9 views
7

दिखा रहा है कि जब मैं कुछ कार्य करता हूं तो कुछ कार्य यूआई स्वयं सक्रिय रहता है और मैं प्रगति-बार में काम की प्रगति दिखाना चाहता हूं।बैकग्राउंडवर्कर में एक विधि चलाना और प्रोग्रेसबार

मेरे पास एक विधि है, एक BackGroundWorker और Progressbar। मैं विधि को कॉल करना चाहता हूं जब BackGroundWorker चलना शुरू होता है और प्रगति दिखाता है। विधि में लूप होता है। तो, यह प्रगति की रिपोर्ट कर सकते हैं।

तो, क्या किया जा सकता है?

private void Form1_Load(object sender, EventArgs e) 
{ 
    // TODO: This line of code loads data into the 'dataSet1.TBLMARKET' table. You can move, or remove it, as needed. 
    myBGWorker.WorkerReportsProgress = true; 
} 

private void myBGWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    parseFiles(); 
} 

private void myBGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    myProgressBar.Value = e.ProgressPercentage; 
} 

private void myBGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    MessageBox.Show("Done"); 
} 

private void parseButton_Click(object sender, EventArgs e) 
{ 
    myBGWorker.RunWorkerAsync(); 
} 

public void parseFiles() 
{ 
    for() 
    { 
    //parsing 
    myBGWorker.ReportProgress(...); 
    } 
} 

लेकिन यह काम नहीं कर रहा है। Progressbar अपडेट नहीं हो रहा है। MessageBox "हो गया" के बाद केवल एक छोटी प्रगति दिखाई दे रही है।

+2

क्या आपके पार्सफ़ाइल 'रिपोर्ट प्रोग्रेस' को कॉल करने का काम करते हैं? – McAden

+0

हां। यह वहाँ है। क्षमा करें मैं इसे पहले जोड़ना भूल गया था। –

उत्तर

16

एक पारसेफाइल विधि (जो कि मेरे बीजीवर्कर पर निर्भर होना चाहिए) का उपयोग करने के बजाय लूप और विधि का उपयोग करें जो एक फ़ाइल को पार्स करता है। उस लूप में प्रगति प्रतिशत की रिपोर्ट करें:

private void parseButton_Click(object sender, EventArgs e) 
{ 
    parseButton.Enabled = false; 
    myBGWorker.RunWorkerAsync(); 
} 

private void myBGWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    for(int i = 0; i < filesCount; i++) 
    { 
     ParseSingleFile(); // pass filename here 
     int percentage = (i + 1) * 100/filesCount; 
     myBGWorker.ReportProgress(percentage); 
    } 
} 

void myBGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    myProgressBar.Value = e.ProgressPercentage; 
} 

void myBGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    parseButton.Enabled = true; 
    MessageBox.Show("Done"); 
} 
+0

क्या आप कृपया टिप्पणी कर सकते हैं कि BackGroundWorker चल रहा है जब बटन को निष्क्रिय कैसे करें। अन्यथा समस्या होगी। –

+0

@ soham.m17 सुनिश्चित करें, पार्सिंग शुरू करते समय बस 'parseButton.Enabled' प्रॉपर्टी सेट करें, और जब पार्सिंग –

+0

पूरा हो जाए लेकिन यह अलग थ्रेड में है। इसलिए इसे 'RunWorkerCompleted' eventHandler में अपवाद फेंकना चाहिए। लेकिन यह फेंक नहीं रहा है? क्या मैं जान सकता हूं क्यों? –

0

मुझे इस प्रश्न के बारे में खेद है। असल में कोड ठीक काम करता है। यह Progressbar दिखा रहा था क्योंकि myBGWorker.ReportProgress() में तर्क भिन्न था और प्रतिशत नहीं था। तो, यह यह नहीं दिखा रहा था। असुविधा के लिए खेद है।

मॉडरेटर इस धागे को हटा सकता है। अन्यथा यह दूसरों के लिए एक ट्यूटोरियल हो सकता है।

0

करने के लिए। soham.m17 प्रेषक तर्क

private void myBGWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    var worker = sender as BackgroundWorker; 
    for(int i = 0; i < filesCount; i++) 
    { 
     ParseSingleFile(); // pass filename here 
     int percentage = (i + 1) * 100/filesCount; 
     worker.ReportProgress(percentage); // use not myBGWorker but worker from sender 
    } 
} 
संबंधित मुद्दे