2012-06-21 40 views
0

嘿,我試圖讓我的背景工人送參數回主線程在我的表格時,它改變..C#Visual Studio 2010的後臺工作,報告進度

在該方法中的後臺工作運行我有這個

worker.ReportProgress(p); 

p是運行

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     label6.Text = e.ToString(); 
    } 

我試圖讓這個標籤文本變更爲p爲背景的作品在一個for循環變量呃經歷循環。

感謝您的任何幫助! :)

回答

3

ReportProgress有兩個參數:

  1. ProgressPercentage(整數)
  2. UserState(對象)

如果你不關心進度百分比,您可以發送0,而不是使用它:

worker.ReportProgress(0, p); 

或者你也可以使用單參數超載和只有發送進度百分比。

在您的處理程序中,ProgressChangedEventArgs有幾個屬性需要使用。要獲取進度百分比值,那麼你訪問它作爲

myPercentLabel.Text = e.ProgressPercentage.ToString; 

,讓您的用戶數據(p),你需要訪問它:

label6.Text = e.UserState.ToString; 

要發送更復雜的數據,您可以發送任何類型的對象或結構在UserState中,只要你在處理程序中正確轉換它。在任何情況下,您必須訪問eProgressPercentageUserState財產。

+0

謝謝我自己也明白了! –

1

你很可能遇到這個問題。首先,如果您的後臺工作人員的循環速度相對較快,那麼值可能會變得太快,以致您的標籤無法跟上。其次,每次設置文本時,標籤可能不一定立即刷新,因此可能會跳過某些值。最後,我相信你真正想要的是e.UserState.ToString()而不僅僅是e.ToString();

1

你必須通過

worker.ReportProgress((int)(p*100.0/loopMaxValue)); 

然後用

label6.Text = e.ProgressPercentage.ToString(); 

,而不是

label6.Text = e.ToString(); 
0

我明白了!

做到了這一點......

label6.Text = e.UserState.ToString();