private void HandleUIButtons()
{
if (!btnSplit.Dispatcher.CheckAccess())
{
//if here - we are on a different non-UI thread
btnSplit.Dispatcher.BeginInvoke(new Action(HandleUIButtons));
}
else
{
btnSplit.IsEnabled = true; //this is ultimately run on the UI-thread
}
}
3 回答
Dispatcher . Dispatcher维护特定线程的优先级工作项队列 . 这可能有助于您更新UI . 如果你有很多与UI相关的初始化,那么这将无法帮助你 .
Dispatcher实际上并不总是替代BackgroundWorker . 最佳做法是根据您的要求选择更合适的一种 . 例如,如果您希望在不排队的情况下执行某些操作,那么BackgroundWorker就是解决方案 . 另一方面,如果排队不是问题,那么Dispatcher是另一种选择 . 例如,Dispatcher正在使用拼写检查程序和语法突出显示功能 .
注意 :
有关更多信息,请参见this thread .
您还可以使用线程池对项目进行排队并运行这样的任务,但要小心,如果您的任务需要在完成后更新UI,则必须将数据封送回UI线程 .
可以使用异步委托 .
http://msdn.microsoft.com/en-us/library/ms228963.aspx
只需确保您使用的是与UI相关的更新:
这是一个简单的例子:
取自这里:
http://blog.clauskonrad.net/2009/03/wpf-invokerequired-dispatchercheckacces.html