2011-05-30 71 views
11

我想设计一个类库并计划使用多线程(即BackgroundWorker)。如果我打算将它们绑定到使用前端的库的GUI,我将不得不注意线程上下文,从中更新字段。据我所知,将GUI调度程序的引用传递给库不是一个好主意。但是,我怎样才能访问将使用该库的应用程序的调度程序?这可能吗?在类库中获取UI调度程序

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

回答

21

哦,哈哈(抱歉,但这是愚蠢的事情之一)Application类在PresentationFramework.dll中定义。您需要参考以便能够通过Application.Current.Dispatcher访问调度程序。

+2

我会同意使用SynchronizationContext是要走的路 – aqwert 2011-05-31 01:28:48

+1

我会说这不符合我的要求。我还看不出如何将这个想法转移到类库 - 也许我错过了一些东西。 – rdoubleui 2011-05-31 19:29:47

+1

对不起,我误解了这个问题。我改变了我的答案。 – 2011-05-31 20:18:13

6

我有同样的问题,即无法解析Application.Current.Dispatcher,并最终将客户端GUI调度程序传递给只包含Dispatcher引用的库(引用WindowsBase +使用System.Windows.Threading)。
我更喜欢这个选项,让我的非GUI库必须携带refFrameFramework.dll(这看起来不自然)。
我猜它的一个6人,其他的半打...

+0

这是我之前完成的方式,但将调度程序引用传递给对象结构看起来并不高雅。我可能是错的。 – rdoubleui 2011-05-30 21:43:21

2

如果你确保(如用类的静态成员),你有一个方便的参考UI Dispatcher,你可以做这个:

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

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

如果您不想将此Dispatcher引用向下传递给库,则IoC容器是一个选项。你也可以把它放在一个Common.dll中,用于exe和类库需要引用的类和接口。该exe可以设置正确的引用,并且类库可以调用Run()方法。

+0

我认为这个问题实际上是在库代码 – Ricibob 2011-05-30 21:31:35

+0

中获取UI /主线程调度程序类似的问题,我可以将'Dispatcher'引用传递给类库,然后将其用在'static'上下文中,如果我对了吗?那么我可以访问它,而不必将它传递给嵌套对象? – rdoubleui 2011-05-31 19:34:31

+1

准确地说,您可以将其保存在其他所有地方都可以访问的地方。如果有多个库需要它,我会提到Common.dll,尽管通常没有理由为它创建一个全新的库。它只需要放入其他所有引用的内容以避免循环依赖。 – 2011-05-31 19:41:17