在WPF中是否有使用后台工作器的替代方法?
本文关键字:方法 工作 后台 WPF 是否 | 更新日期: 2023-09-27 18:04:54
我是WPF的初学者,在我的应用程序中,我需要执行一系列初始化步骤,这些步骤需要10-15秒才能完成,在此期间我的UI变得无响应。
我昨天正在使用后台工作人员,但它没有更新我的窗口,事实上它被冻结了。不确定,但也许它没有工作,因为这个控件只适用于Windows窗体。
更新:
如果不太麻烦的话,你能给我发一个使用替代方法的例子吗?对于我的例子,程序将从数据库中以蓝色显示一些值。
Dispatcher。Dispatcher维护特定线程的工作项的优先级队列。这可能有助于更新UI。如果你有很多UI相关的初始化,即使这样也帮不上什么忙。
Dispatcher实际上并不总是BackgroundWorker的替代品。最佳实践是根据您的需求选择更合适的一个。例如,如果你想在没有排队的情况下执行某事,BackgroundWorker就是解决方案。另一方面,如果排队不是问题,那么Dispatcher是另一种选择。例如,Dispatcher正在使用拼写检查器和语法高亮功能。
WPF线程模型所有WPF应用程序都从两个重要线程开始,一个用于一个用于呈现,一个用于管理用户界面。呈现线程是一个隐藏的线程,在后台运行,所以只有通常处理的线程是UI线程。WPF需要它的大多数对象被绑定到UI线程。这被称为线程关联,这意味着您只能在线程上使用WPF对象它是在上面创建的。在其他线程上使用它将导致要抛出的运行时异常。注意WPF线程模型与基于Win32®的api很好地互操作。这意味着WPF可以主机或由任何基于hwnd的API (Windows Forms, Visual Basic®,MFC,甚至是Win32)。
线程关联由Dispatcher处理类,用于WPF应用程序的优先级消息循环。通常你的WPF项目有一个Dispatcher对象(因此也有一个Dispatcher对象)UI线程),所有的用户界面工作都是通过这个线程进行的。
注意:
Dispatcher和其他线程方法的主要区别Dispatcher实际上并不是多线程的。分配器管理控件,这些控件需要一个线程才能正常工作;Dispatcher的BeginInvoke方法为以后的事件排队执行(取决于优先级等),但仍然在同一个线程上。
您也可以将项目与线程池一起排队并像这样运行任务,但要小心,如果您的任务需要在完成时更新UI,则必须将数据封送回UI线程。
可以使用异步委托。
http://msdn.microsoft.com/en-us/library/ms228963.aspx只要确保你正在做任何UI相关的更新使用:
Dispatcher.CheckAccess()
这里有一个简单的例子:
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
}
}
摘自:
http://blog.clauskonrad.net/2009/03/wpf-invokerequired-dispatchercheckacces.html