C# 在类库中获取UI调度程序

C# 在类库中获取UI调度程序,c#,wpf,multithreading,user-interface,dispatcher,C#,Wpf,Multithreading,User Interface,Dispatcher,我想设计一个类库并计划使用多线程(即BackgroundWorker)。如果我计划将字段绑定到库前端的GUI,我必须注意线程上下文,从中可以对字段进行更新。正如我所读到的,将GUI调度程序的引用传递给库不是一个好主意。但是,如何访问将使用库的应用程序的调度程序?这可能吗 我尝试了Application.Current.Dispatcher并添加了对WindowBase的引用(因为我无法添加System.Windows),但仍然无法解析Dispatcher对象。应用程序类在Presentation

我想设计一个类库并计划使用多线程(即
BackgroundWorker
)。如果我计划将字段绑定到库前端的GUI,我必须注意线程上下文,从中可以对字段进行更新。正如我所读到的,将GUI调度程序的引用传递给库不是一个好主意。但是,如何访问将使用库的应用程序的调度程序?这可能吗


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

应用程序类在
PresentationFramework.dll
中定义。为了能够通过
Application.Current.dispatcher

访问dispatcher,您需要引用它。我遇到了同样的问题,即无法解决Application.Current.dispatcher,并最终将客户端gui dispatcher传递到只保存dispatcher ref的库(参考WindowsBase+使用System.Windows.Threading)。
我更喜欢这个选项,即非GUI库必须带有对PresentationFramework.dll的引用(这似乎并不自然)。
我猜这是六个一个,半打另一个…

如果您确保(例如使用类的静态成员)有一个方便的UI
Dispatcher的引用,您可以执行以下操作:

public static void Run( Action a ) {
    if ( !_uiDispatcher.CheckAccess() ) {
        _uiDispatcher.BeginInvoke( a );
    }
    else {
        a();
    }
}
我看过的一两个MVVM框架都是这样做的


如果您不想将此
调度程序
引用向下传递到库,则可以选择IoC容器。您还可以将其放置在exe和类库都需要引用的类和接口的Common.dll中。exe可以设置正确的引用,类库可以调用
Run()
方法。

我认为问题实际上是获取UI/主线程调度程序,而在库代码中类似的问题,我可以将
dispatcher
引用传递到类库,然后在
静态
上下文中使用它,如果我理解正确的话?那么我可以访问它,而无需将其传递给嵌套的o对象?!没错,你把它放在其他所有人都可以访问的地方。我提到的Common.dll是指如果有多个库也需要它,尽管通常没有理由为它创建一个全新的库。它只需要进入其他所有人都引用的库中,以避免循环依赖。这是一种替代方法,谢谢。我将John Leidegren的语句标记为答案,因为它回答了我的原始问题。这是我以前的做法,但将dispatcher引用向下传递到对象结构似乎并不优雅。我可能是错的。我没有发现在类库中添加对PresentationFramework的引用并调用dispatcher有任何问题。这样,我就可以您不需要任何额外的属性|变量|构造函数变量|额外的注释,只需调用Dispatcher.Invoke(…):D(如果结果证明我不需要Dispatcher.Invoke(…),删除PresentationFramework ref,完成ezpz:p)我同意使用SynchronizationContext是一种方式,我会说这不符合我的要求。我还不知道如何将这个想法转移到类库中-也许我遗漏了什么。很抱歉,我误解了这个问题。我更改了答案。谢谢,它回答了我的问题。此外
PresentationFramework
WindowBase
我还需要引用
System.Xaml
。所以我在哪里可以找到它,我在我的引用管理器中找不到它