我想设计一个类库,并计划使用多线程(即BackgroundWorker
)。如果我打算将线程上下文绑定到使用前端的库的GUI,则必须注意线程上下文,从该线程上下文进行字段更新。如我所读,将GUI调度程序的引用传递给库不是一个好主意。但是,如何获得将使用该库的应用程序的调度程序?这可能吗?
我尝试了Application.Current.Dispatcher
并添加了对WindowBase
的引用(因为我没有可能添加System.Windows
),但仍然无法解析调度程序对象。
Application类在PresentationFramework.dll
中定义。您需要引用它,以便能够通过Application.Current.Dispatcher
访问调度程序。
我有同样的问题,即无法解析Application.Current.Dispatcher,最终将客户端gui调度程序传递到仅包含Dispatcher引用的库(使用System.Windows.Threading引用WindowsBase +)。我更喜欢使用该选项,因为我的非GUI库必须携带对PresentationFramework.dll的引用(这似乎不自然)。我猜它的六分之一,其他六分...
[如果您确保(例如,使用类的静态成员)对UI Dispatcher
的引用很方便,则可以执行此操作:
public static void Run( Action a ) {
if ( !_uiDispatcher.CheckAccess() ) {
_uiDispatcher.BeginInvoke( a );
}
else {
a();
}
}
我看过的一个或两个MVVM框架做了这样的事情。
如果您不想将此Dispatcher
参考向下传递给库,则可以选择IoC容器。您也可以将它放在Common.dll中,以获取exe和类库都需要引用的类和接口。 exe可以设置正确的引用,并且类库可以调用Run()
方法。