如何从其他 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 的通用容器 - 它是如何工作的?

PyQt:如何从 QThread 获取 UI 数据

AppDomain.Unload() 如何中止线程?

从其他 .dll 加载服务并隔离运行

当从外部线程调用时,.net 单元测试崩溃并显示“无法通过 AppDomains 传递 GCHandle”

如何从线程更新 UI?