我正在开发一个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;
答案 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。