为什么我使用BackgroundWorker.ReportProgress获取TargetInvocationException?

时间:2011-11-22 14:46:51

标签: c# multithreading exception backgroundworker

我正在开发一个C#项目,我有一个背景工作者,可以完成“昂贵的工作”。

在我的“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事件处理程序,并且不知道我必须手动设置:

bgrndWorkerSearchMatches.WorkerReportsProgress = true;

3 个答案:

答案 0 :(得分:9)

抛出TargetInvocationException来包装最终调用的方法抛出的异常。

检查InnerException以了解发生的情况。

答案 1 :(得分:2)

找到答案:

我用visual studio创建了backgroundworker eventhandler,并且不知道我必须设置:

bgrndWorkerSearchMatches.WorkerReportsProgress = true;

无论如何,感谢很多人

答案 2 :(得分:1)

您不会说出此ReportProgress()实际执行的操作,但您需要调用该命令。

我想它会像:

private void ReportProgress(int percentage)
{
  this.SetProgressBar(percentage);
}
然后在&#34;父母&#34;设置工作线程的代码:

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;
            }
        }

使用WinForms查看示例here