我想设计一个类库并计划使用多线程(即BackgroundWorker
)。如果我打算将它们绑定到使用前端的库的GUI,我将不得不注意线程上下文,从中更新字段。据我所知,将GUI调度程序的引用传递给库不是一个好主意。但是,我怎样才能访问将使用该库的应用程序的调度程序?这可能吗?在类库中获取UI调度程序
我试过Application.Current.Dispatcher
并添加了对WindowBase
的引用(因为我没有可能添加System.Windows
),但仍无法解析调度程序对象。
我想设计一个类库并计划使用多线程(即BackgroundWorker
)。如果我打算将它们绑定到使用前端的库的GUI,我将不得不注意线程上下文,从中更新字段。据我所知,将GUI调度程序的引用传递给库不是一个好主意。但是,我怎样才能访问将使用该库的应用程序的调度程序?这可能吗?在类库中获取UI调度程序
我试过Application.Current.Dispatcher
并添加了对WindowBase
的引用(因为我没有可能添加System.Windows
),但仍无法解析调度程序对象。
哦,哈哈(抱歉,但这是愚蠢的事情之一)Application类在PresentationFramework.dll中定义。您需要参考以便能够通过Application.Current.Dispatcher
访问调度程序。
我有同样的问题,即无法解析Application.Current.Dispatcher,并最终将客户端GUI调度程序传递给只包含Dispatcher引用的库(引用WindowsBase +使用System.Windows.Threading)。
我更喜欢这个选项,让我的非GUI库必须携带refFrameFramework.dll(这看起来不自然)。
我猜它的一个6人,其他的半打...
这是我之前完成的方式,但将调度程序引用传递给对象结构看起来并不高雅。我可能是错的。 – rdoubleui 2011-05-30 21:43:21
如果你确保(如用类的静态成员),你有一个方便的参考UI Dispatcher
,你可以做这个:
public static void Run(Action a) {
if (!_uiDispatcher.CheckAccess()) {
_uiDispatcher.BeginInvoke(a);
}
else {
a();
}
}
我看过的一个或两个MVVM框架做类似这样的事情。
如果您不想将此Dispatcher
引用向下传递给库,则IoC容器是一个选项。你也可以把它放在一个Common.dll中,用于exe和类库需要引用的类和接口。该exe可以设置正确的引用,并且类库可以调用Run()
方法。
我会同意使用SynchronizationContext是要走的路 – aqwert 2011-05-31 01:28:48
我会说这不符合我的要求。我还看不出如何将这个想法转移到类库 - 也许我错过了一些东西。 – rdoubleui 2011-05-31 19:29:47
对不起,我误解了这个问题。我改变了我的答案。 – 2011-05-31 20:18:13