2016-08-14 71 views
-1

我有一個不會報告進度的Backrgound工作人員。我需要得到一個確切的值,而不是一個百分比。我不確定如何編碼進度更改事件。我已將WorkReportsProgress屬性設置爲true。我對C#還是比較陌生,所以請原諒我的糟糕知識。後臺工作人員不會報告進度

private void BKGWork_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 
     for (int i = 1; i <= 20; i++) 
     { 
      //do work 
      worker.ReportProgress(i); 
     } 
    } 
private void BKGWork_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     //not sure how to get the exact value of i and compare it to see which loop the background worker is in. 
    } 

回答

1

使用worker.ReportProgress(0,i);傳遞您的顯式值作爲用戶狀態參數。可以使用在e.UserState訪問此強制轉換爲int

+0

嘗試了這種方法,但仍沒有得到任何結果。控制檯完全空白。 –

+0

您是否調用了'RunWorkerAsync'來啓動後臺工作?你確定你的事件處理程序已訂閱。 – FloatingKiwi

+0

我弄明白了,我還沒有宣佈ProgressChanged事件。你的方法有效。 –

2

無論你傳遞給ReportProgress作爲第一個參數是您在e.ProgressPercentage獲得的價值,BackgroundWorker的類不能計算爲你「百分比」。如果你需要一個更復雜的數據(一個類的實例,例如,你可以使用ReportProgress的第二個可選的參數,並在UserState參數

private void BKGWork_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 
    for (int i = 1; i <= 20; i++) 
    { 
     //do work 
     worker.ReportProgress(i); 
    } 
} 
private void BKGWork_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    // This is the value of the variable i passed above 
    Console.WriteLine(e.ProgressPercentage); 
} 

檢索根據您的評論如下,似乎你還沒有正確設置事件處理程序,這很容易發現,如果你可以使用調試程序,在ProgressChanged事件中放置一個斷點(F9)並運行程序(F5),如果沒有命中斷點,檢查是否有在設計器或代碼中正確設置事件處理程序,否則如果命中斷點,請查看Visual Studio的輸出窗口(在運行時,在NON控制檯應用程序中,控制檯輸出重定向到Visual Studio的輸出窗口)

+0

我在控制檯上一無所獲。完全空白 –

+0

如果您可以使用調試器,則在ProgressChanged事件內的一行中放置一個斷點並運行該程序。如果斷點未命中,則檢查是否在設計器或代碼中正確設置了事件處理程序。否則,如果命中斷點,那麼你不看輸出窗口(在運行時,在NON控制檯應用程序中,控制檯輸出被重定向到Visual Studio的輸出窗口) – Steve

+0

我還沒有聲明ProgressChanged的事件處理程序事件。愚蠢的我。謝謝你的頭:) –