在类库中获取UI调度程序

问题描述 投票:15回答:3

我想设计一个类库,并计划使用多线程(即BackgroundWorker)。如果我打算将线程上下文绑定到使用前端的库的GUI,则必须注意线程上下文,从该线程上下文进行字段更新。如我所读,将GUI调度程序的引用传递给库不是一个好主意。但是,如何获得将使用该库的应用程序的调度程序?这可能吗?

我尝试了Application.Current.Dispatcher并添加了对WindowBase的引用(因为我没有可能添加System.Windows),但仍然无法解析调度程序对象。

c# wpf multithreading user-interface dispatcher
3个回答
27
投票

Application类在PresentationFramework.dll中定义。您需要引用它,以便能够通过Application.Current.Dispatcher访问调度程序。


6
投票

我有同样的问题,即无法解析Application.Current.Dispatcher,最终将客户端gui调度程序传递到仅包含Dispatcher引用的库(使用System.Windows.Threading引用WindowsBase +)。我更喜欢使用该选项,因为我的非GUI库必须携带对PresentationFramework.dll的引用(这似乎不自然)。我猜它的六分之一,其他六分...


3
投票

[如果您确保(例如,使用类的静态成员)对UI Dispatcher的引用很方便,则可以执行此操作:

public static void Run( Action a ) {
    if ( !_uiDispatcher.CheckAccess() ) {
        _uiDispatcher.BeginInvoke( a );
    }
    else {
        a();
    }
}

我看过的一个或两个MVVM框架做了这样的事情。

如果您不想将此Dispatcher参考向下传递给库,则可以选择IoC容器。您也可以将它放在Common.dll中,以获取exe和类库都需要引用的类和接口。 exe可以设置正确的引用,并且类库可以调用Run()方法。

© www.soinside.com 2019 - 2024. All rights reserved.