【发布时间】:2013-11-03 02:44:57
【问题描述】:
像许多应用程序一样,我想在应用程序进行长时间计算时更新我的状态文本。我读过关于 Dispatcher 和 BackgroundWorker 的文章。我知道我肯定需要确保更新发生在 UI 线程中。我的第一次尝试是:
MyView.UpdateStatus( "Please wait" );
LongComputation();
MyView.UpdateStatus( "Ready" );
这不起作用,因为(我认为)LongComputation 阻止了状态被更新。
所以我尝试这样做:
BackgroundWorker worker = new BackgroundWorker();
MyView.UpdateStatus( "Please wait");
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
LongComputation();
}
worker.RunWorkerAsync();
MyView.UpdateStatus( "Ready" );
我希望额外的线程会给 UpdateStatus 一个更新状态文本的机会。它也不起作用。原因之一是 LongComputation 的结果显示在 Windows 窗体中。一旦我将 LongComputation 放入 BackgroundWorker 中,结果就不会显示出来。
所以我第三次尝试使用流动代码:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
Dispatcher.Invoke(((Action)(() => Status.Text = args.Argument as string)));
};
worker.RunWorkerAsync(newStatus);
我希望将更新放在另一个线程中会起作用。但它没有。
如何确保状态反映正确的程序状态?
【问题讨论】:
-
LongComputation 是否返回 UI 正在等待的内容?
-
不,它在一些复杂的计算之后绘制了一个折线图。
标签: wpf backgroundworker dispatch