我想设计一个类库,并计划使用多线程(即 BackgroundWorker
)。如果我打算将这些字段绑定到消费前端的库的GUI,那么我必须注意线程上下文,从中更新这些字段。根据我所读的,将GUI调度程序的引用传递给库不是一个好主意。但是我如何获得将使用该库的应用程序的调度程序?这是可能的吗?
我尝试过Application.Current.Dispatcher
,并添加了对WindowBase
的引用(因为我没有添加System.Windows
的可能性),但仍然无法解析分派程序对象。
我想设计一个类库,并计划使用多线程(即 BackgroundWorker
)。如果我打算将这些字段绑定到消费前端的库的GUI,那么我必须注意线程上下文,从中更新这些字段。根据我所读的,将GUI调度程序的引用传递给库不是一个好主意。但是我如何获得将使用该库的应用程序的调度程序?这是可能的吗?
我尝试过Application.Current.Dispatcher
,并添加了对WindowBase
的引用(因为我没有添加System.Windows
的可能性),但仍然无法解析分派程序对象。
Application类定义在PresentationFramework.dll
中。为了能够通过Application.Current.Dispatcher
访问调度程序,您需要引用该类库。
我曾经遇到同样的问题,即无法解决Application.Current.Dispatcher,最终我将客户端GUI Dispatcher传递给库,该库仅持有Dispatcher引用(引用WindowsBase+使用System.Windows.Threading)。
与其让我的非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()
方法。
Dispatcher
引用传递给类库,然后从那里在static
上下文中使用它,这样我就可以在不向嵌套对象传递它的情况下访问它了?! - rdoubleui
PresentationFramework
和WindowBase
之外,我还需要引用System.Xaml
。 - rdoubleui