如何解决“跨线程操作无效”的问题?

时间:2010-07-19 13:02:51

标签: .net winforms multithreading backgroundworker

我有一个Windows窗体对话框,其中一个较长的操作在 backgroundworker 作业中运行(异步)。在此操作期间,我想更改表单上的一些值(标签,...)。但是当backgroundworker尝试更改表单上的某些内容时,我收到错误“跨线程操作无效”!如何解决这个问题?

4 个答案:

答案 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