在类库中获取UI调度程序

时间:2011-05-30 20:50:34

标签: c# wpf multithreading user-interface dispatcher

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

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

3 个答案:

答案 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()方法。