【发布时间】: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