2011-11-22 78 views
3

我正在開發一個C#項目,其中有一個Backgroundworker,可以完成「昂貴的工作」。爲什麼我會用BackgroundWorker.ReportProgress獲取TargetInvocationException?

在我的「DoWork」中,我想通過「backgroundworker.ReportProgress(some int)」報告進度。但是當我的程序進入調用「backgroundworker.ReportProgress(some int)」時,我得到一個「System.Reflection.TargetInvocationException」。

如何解決我的問題?

private void btnGrap_Click(object sender, EventArgs e) 
    { 
     //some code 
     ListsObject listsObject = new ListsObject(filePaths, enumList); 
     progressBar1.Maximum = 100;//count; 
     this.bgrndWorkerSearchMatches.RunWorkerAsync(listsObject); 
    } 

_DoWork:

private void backgroundWorkerSearchMatches_DoWork(object sender, DoWorkEventArgs e) 
    { 
     for (int i = 0; i < 100; i++) 
     { 
      bgrndWorkerSearchMatches.ReportProgress(i); 
     } 
    } 

_ProcessChanged:

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

我找到了答案:

Visual Studio創建BackgroundWorker的事件處理程序,做了ñ OT知道我不得不手動設置:

bgrndWorkerSearchMatches.WorkerReportsProgress = true; 
+0

您可能希望設置調試器打破所有異常。 – SLaks

回答

2

找到了答案:

我創建BackgroundWorker的事件處理程序使用Visual Studio,不知道我必須manualy設置:

bgrndWorkerSearchMatches.WorkerReportsProgress = true; 

反正非常感謝球員

+0

很高興你找到答案。 – ChrisBD

9

TargetInvocationException被拋出來包裝,其通過這些條件最終調用的方法拋出一個不同的異常。

查看InnerException瞭解發生了什麼。

+0

我試過'代碼'嘗試{bgrndWorkerSearchMatches.ReportProgress(count); } catch(System.Reflection.TargetInvocationException tiEx){throw tiEx.InnerException; }'代碼'但我在內部異常之前得到異常 – scro

+0

不要拋出InnerException;它會破壞堆棧跟蹤。相反,請查看調試器中的InnerException。 – SLaks

1

你不說這個ReportProgress()實際上做了什麼,但你需要調用該命令。

我想,這會是這樣的:

private void ReportProgress(int percentage) 
{ 
    this.SetProgressBar(percentage); 
} 

然後在設定的工作線程「父」的代碼:使用

delegate void SetProgressBarCallback(int percentage); 
public void SetProgressBar(int percentage) 
     { 
      // InvokeRequired required compares the thread ID of the 
      // calling thread to the thread ID of the creating thread. 
      // If these threads are different, it returns true. 
      if (this.progressBar1.InvokeRequired) 
      { 
       SetProgressBarCallback d = new SetProgressBarCallback(SetProgressBar); 
       this.Invoke(d, new object[] { percentage}); 
      } 
      else 
      { 
       this.progressBar1.value = precentage; 
      } 
     } 

有一個例子看看here的WinForms。

+0

如果您需要後臺操作來報告其進度,則可以調用ReportProgress方法來引發ProgressChanged事件。 http://msdn.microsoft.com/en-us/library/ka89zff4.aspx – scro

+0

如果你使用它來觸發你的進度條位置的變化,你仍然需要檢查並使用一個回調調用更新UI。 – ChrisBD

相關問題