我有一个在主线程上的Windows表单,还有另一个线程执行一些计算。我想从在另一个线程中进行的工作更新我的表单上的状态栏。最好的方法是什么?
到目前为止,我尝试的所有方法都使事情变得非常缓慢。我正在使用Visual Studio 2005。
我有一个在主线程上的Windows表单,还有另一个线程执行一些计算。我想从在另一个线程中进行的工作更新我的表单上的状态栏。最好的方法是什么?
到目前为止,我尝试的所有方法都使事情变得非常缓慢。我正在使用Visual Studio 2005。
Control.Invoke
的封送技术来在 UI 线程上执行委托,从而可以安全地操作 UI 元素,但是这种方法并不好。实际上,如果您只想更新简单的进度信息,那么这种方法非常糟糕。System.Windows.Forms.Timers
进行轮询。public class Example : Form
{
private volatile int percentComplete = 0;
private void StartThreadButton_Click(object sender, EventArgs args)
{
StatusBarUpdateTimer.Enabled = true;
new Thread(
() =>
{
for (int i = 1; i <= 100; i++)
{
DoSomeWork();
percentComplete = i;
}
}).Start();
}
private void StatusBarUpdateTimer_Tick(object sender, EventArgs args)
{
yourStatusBarPanel.Text = percentComplete.ToString() + "%";
StatusBarUpdateTimer.Enabled = percentComplete < 100;
}
}
percentComplete
字段被声明为'volatile',确保其值可以从多个线程可靠地读取。Invoke
的情况不同。Invoke
会强加这种耦合。BeginInvoke
的情况一样。Invoke
调用。你可以向主线程发送消息并让它更新进度条,但是你需要检查这些消息。你也可以像轮询函数一样做同样的事情。