在WPF中是否有使用后台工作器的替代方法?

本文关键字:方法 工作 后台 WPF 是否 | 更新日期: 2023-09-27 18:04:54

我是WPF的初学者,在我的应用程序中,我需要执行一系列初始化步骤,这些步骤需要10-15秒才能完成,在此期间我的UI变得无响应。

我昨天正在使用后台工作人员,但它没有更新我的窗口,事实上它被冻结了。不确定,但也许它没有工作,因为这个控件只适用于Windows窗体。

更新:

如果不太麻烦的话,你能给我发一个使用替代方法的例子吗?对于我的例子,程序将从数据库中以蓝色显示一些值。

在WPF中是否有使用后台工作器的替代方法?

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