我想设计一个类库并计划使用多线程(即BackgroundWorker
)。如果我打算将它们绑定到使用前端的库的GUI,我将不得不注意线程上下文,从中为字段进行更新。在我阅读时,将GUI调度程序的引用传递给库并不是一个好主意。但是,如何才能访问将使用该库的应用程序的调度程序?这可能吗?
我尝试Application.Current.Dispatcher
并添加了对WindowBase
的引用(因为我无法添加System.Windows
),但仍然无法解析调度程序对象。
答案 0 :(得分:24)
哦,哈哈(对不起,但这是其中一个愚蠢的事情)Application类是在PresentationFramework.dll中定义的。您需要引用它才能通过Application.Current.Dispatcher
访问调度程序。
答案 1 :(得分:6)
我有同样的问题,即无法解析Application.Current.Dispatcher并最终将客户端gui调度程序传递给只包含Dispatcher引用的库(引用WindowsBase +使用System.Windows.Threading)。 />
我更喜欢这个选项,让我的非GUI lib必须携带一个引用PresentationFramework.dll(这看起来不自然)。
我想其中的6个,其他的6个......
答案 2 :(得分: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()
方法。