【问题标题】:How to solve the "Cross-thread operation not valid" Problem?如何解决“跨线程操作无效”的问题?
【发布时间】:2010-07-19 13:02:51
【问题描述】:

我有一个 Windows 窗体对话框,在 backgroundworker 作业中运行较长的操作(异步)。在此操作期间,我想更改表单上的一些值(标签,...)。但是当后台工作人员尝试更改表单上的某些内容时,我收到错误“Cross-thread operation not valid”!这个问题怎么解决?

【问题讨论】:

标签: .net winforms multithreading backgroundworker


【解决方案1】:

从worker调用ReportProgress方法,并处理ProgressChanged更新当前状态。

【讨论】:

    【解决方案2】:

    检查是否需要调用,然后调用 BeginInvoke。

    private void AdjustControls()
            {
                if (this.InvokeRequired)
                {
                    this.Invoke(new MethodInvoker(this.AdjustControls));
                }
                else
                {
                    label1.Text = "Whatever";
                }
            }
    

    【讨论】:

    • 我试过这个。但它不起作用。你能不能给我更多的细节。提前致谢!
    • 对不起,我把它修好了。如果 AdjustControls 带参数,例如,如果它是一个事件处理程序,那么你不能使用 MethodInvoker,你必须为它定义一个委托。
    【解决方案3】:

    我觉得在这里按自己的号角有点奇怪,但您可能会从我为此目的编写的 ThreadSafeControls 库中找到一些用处。

    【讨论】:

      【解决方案4】:

      您不能直接在未创建控件的线程内更改控件。您可以使用如上所示的调用方法,也可以使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-11
        相关资源
        最近更新 更多