如何处理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中。如何以更好的方式处理它。请帮我做这件事
Invoke()
通过从UI线程运行给定的委托来工作。所以如果你使用Invoke()
来运行你的整个方法,那么你的整个方法从UI线程运行。
相反,你应该做你的实际工作在另一个线程,只是执行UI更新在UI线程,只是Invoke()
执行更新的小代码。
BackgroundWorker
类。这里已经回答了这个问题-在您的情况下,代码应该看起来像:
this.BeginInvoke((Action)(() => progressBar1.Value++));