如何从其他 appdomain 获取 UI 线程调度程序?
Posted
技术标签:
【中文标题】如何从其他 appdomain 获取 UI 线程调度程序?【英文标题】:How to get UI thread dispatcher from other appdomain? 【发布时间】:2017-08-07 17:13:23 【问题描述】:我曾经在常规 WPF 应用程序中使用 Application.Current.Dispatcher
获取 Dispatcher。但是当我尝试从不同的 AppDomain 获取它时它不起作用,因为 Application.Current
在那里返回 null。
【问题讨论】:
在正确的 AppDomain 中触发一个事件并在那里使用调度程序 您能描述一下您要达到的目标吗?另外据我了解,您无法从其他AppDomain
访问 WPF 消息调度程序。您可以使用一种或另一种机制跨越AppDomain
边界并传递一些信息,但我想您应该考虑重新考虑为什么需要它。
@Sergey.quixoticaxis.Ivanov 我正在创建一个支持插件的应用程序。这些插件有自己的 GUI,显示在主窗口中。插件托管在与主应用程序不同的 AppDomain 中。有时调用调度程序来更新一些 GUI 很有用,我正在寻找一种优雅的方式来接收它,就像在单域应用程序中通过 Application.Current.Dispatcher
完成的那样。
@Matas 据我记得(很久以前)如果您将插件包装在MarshalByRef
对象中,那么您可以在主@987654327 中订阅代理对象上的事件@。我想这是@Gusman 建议你做的。在远程域中触发事件并在主域中处理它(可能调用调度程序方法)。
【参考方案1】:
当我过去需要访问Dispatcher
,但Application.Current
为空时,我使用构造函数注入来注入Window 的Dispatcher
。
public partial class MainWindow : Window
public MainWindow()
InitializeComponent();
var objectNeedingDispatcher = new ClassNeedingDispatcher(this.Dispatcher);
public class ClassNeedingDispatcher
private readonly Dispatcher _injectedDispatcher;
public ClassNeedingDispatcher(Dispatcher injectedDispatcher)
_injectedDispatcher = injectedDispatcher;
【讨论】:
以上是关于如何从其他 appdomain 获取 UI 线程调度程序?的主要内容,如果未能解决你的问题,请参考以下文章
用于将 POCO 实例公开给其他 AppDomain 的通用容器 - 它是如何工作的?