2012-12-14 33 views
7

我想要的是當某種方法正在執行一些任務時UI保持活動狀態,我想在進度條中顯示工作進度。在BackGroundWorker中運行一個方法並顯示ProgressBar

我有一個方法,BackGroundWorkerProgressbar。我想在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

您的parseFiles函數調用「ReportProgress」嗎? – McAden

+0

是的。在那。對不起,我忘了以前添加它。 –

回答

16

而不是使用一個ParseFiles方法(應該依賴於myBGWorker)使用循環和方法來解析一個文件。報告該環路中的進度百分比:

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 
    } 
} 
相關問題