我有一个Windows窗体对话框,其中一个较长的操作在 backgroundworker 作业中运行(异步)。在此操作期间,我想更改表单上的一些值(标签,...)。但是当backgroundworker尝试更改表单上的某些内容时,我收到错误“跨线程操作无效”!如何解决这个问题?
答案 0 :(得分:3)
从工作人员调用ReportProgress
方法,并处理ProgressChanged
以更新当前状态。
答案 1 :(得分:2)
检查是否需要调用,然后调用BeginInvoke。
private void AdjustControls()
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(this.AdjustControls));
}
else
{
label1.Text = "Whatever";
}
}
答案 2 :(得分:1)
我觉得在这里发出自己的号角有点奇怪,但你可能会从我为此目的写的ThreadSafeControls库中找到一些用处。
答案 3 :(得分:1)
您无法直接在未创建控件的线程内更改控件。您可以使用如上所示的invoke方法,也可以使用BackgroundWorker ProgressChanged事件。
BackgroundWorker DoWork中使用的代码:
myBackgroundWorker.ReportProgress(50); // Report that the background worker has got to 50% of completing its operations.
BackgroundWorker ProgressChanged中使用的代码:
progressBar1.Value = e.ProgressPercentage; // Change a progressbar on the WinForm