如何处理C sharp windows应用程序中的跨线程错误

本文关键字:应用程序 错误 线程 windows sharp 何处理 处理 | 更新日期: 2023-09-27 18:12:57

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

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

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();
        }

现在我可以移动窗口,但是当我移动时进度条停止了,当我释放鼠标按钮时它又恢复了。执行仍然在uithread中。如何以更好的方式处理它。请帮我做这件事

如何处理C sharp windows应用程序中的跨线程错误

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

相反,你应该做你的实际工作在另一个线程,只是执行UI更新在UI线程,只是Invoke()执行更新的小代码。

要做到这一点,一个简单的方法是使用标准库中内置的BackgroundWorker类。

这里已经回答了这个问题-在您的情况下,代码应该看起来像:

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