【问题标题】:How to handle cross thread error in C sharp windows application?如何处理 C sharp windows 应用程序中的跨线程错误?
【发布时间】:2011-11-02 04:29:44
【问题描述】:

我有一个带有进度条和按钮的应用程序。

当按钮点击时进度条值会增加,这里是源代码,

private void Run()
        {               
                progressBar1.Maximum = 1000;
                progressBar1.Minimum = 0;
                progressBar1.Step = 1;

                for (int l_nIndex = 0; l_nIndex < 1000; l_nIndex++)
                {
                        progressBar1.Value++;
                        Thread.Sleep(10);
                }
            }


private void button1_Click(object sender, EventArgs e)
        {
                Run();
    }

所以当我运行应用程序时,进度条值会增加,但是当我尝试移动窗口时它没有响应。

我无法以正常线程方式运行它 - 它会引发跨线程错误。

所以我改变了代码,

private void Run()
        {
                if (this.InvokeRequired)
                {
                    this.Invoke(new MethodInvoker(this.Run));
                }
                else
                {
                    progressBar1.Maximum = 1000;
                    progressBar1.Minimum = 0;
                    progressBar1.Step = 1;
                    for (int l_nIndex = 0; l_nIndex < 1000; l_nIndex++)
                    {
                            progressBar1.Value++;
                            Thread.Sleep(10);
                    }
                }
        }

 private void button1_Click(object sender, EventArgs e)
        {
                Thread myThread = new Thread(new ThreadStart( Run));
              myThread.Start();
        }

现在我可以移动窗口,但是当我移动进度条时,进度条会停止,当我松开鼠标按钮时,它会恢复。所以仍然在 UI 线程中执行。 如何以更好的方式处理它。请帮我这样做。

【问题讨论】:

  • 在这里查看我的答案:[对“跨线程操作失败”的回答][1] [1]:stackoverflow.com/questions/1489374/…
  • 这里的一切都是错误的,我对此无能为力。一切。为什么不只使用 Timer 控件?

标签: c# winforms multithreading


【解决方案1】:

Invoke() 通过从 UI 线程运行给定的委托来工作。因此,如果您使用Invoke() 运行您的整个方法,那么您的整个方法将从 UI 线程运行。

相反,您应该在另一个线程中执行您的实际工作,并在 UI 线程中执行 UI 更新,只需 Invoke()ing 一点点执行更新的代码。

一种简单的方法是使用标准库中内置的BackgroundWorker 类。

【讨论】:

    【解决方案2】:

    已回答 here - 在您的情况下,代码应类似于:

    this.BeginInvoke((Action)(() => progressBar1.Value++));
    

    【讨论】:

      猜你喜欢
      • 2011-02-26
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 2013-08-16
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多