使用Dispatcher从工作线程修改GUI元素的正确方法?

时间:2010-10-13 14:22:38

标签: c# wpf user-interface .net-3.5 dispatcher

我在这里有一个问题,我想从各种工作线程修改GUI元素。直到今天,我使用的方法都有效,但很可能非常不正确。

最简单的情况涉及我的插件的GUI,它在工作线程中执行某些操作,当该方法完成其工作时,它会调用我的回调。该回调方法是从同一个线程处理的,因此它无法执行任何GUI工作。但是,当我的主应用程序GUI显示我的插件GUI时,我的插件GUI会缓存其Dispatcher引用 - 当我需要进行GUI更新时(或者在这种情况下,显示一个对话框),我调用Dispatcher.Invoke(.. )。

在我的插件中设置Dispatcher是否存在任何固有的危险?

今天,我对这种方法有了新的问题。我的应用程序需要在我的插件中调用该方法,该方法启动工作线程并显示一个对话框。如果在打开插件的GUI(缓存Dispatcher引用)之前调用该方法,则操作将失败,因为Dispatcher为null。我总是检查一下,以确保应用程序不会崩溃。但是,由于未显示对话框,因此无法继续进行必要的用户交互。

有人能建议一个更好的方法来使用Dispatcher来确保我可以从我的主应用程序中显示/修改插件的GUI元素吗?我现在唯一能想到的就是让我的主应用程序将其Dispatcher引用传递给我的插件加载器,在我的插件接口中添加一个“SetDispatcher”方法,然后让插件加载器为每个需要的插件调用它加载。

2 个答案:

答案 0 :(得分:0)

如果您的插件的GUI 必须在后台线程完成时存在,您应该确保在分离该后台进程之前发生插件GUI创建/实例化。这样,插件GUI元素Dispatcher在异步内容完成之前由框架设置。

在更高级别(您可能或可能无法解决此问题),您似乎在GUI和后台发生的事情之间存在一些不恰当的耦合。

答案 1 :(得分:0)

现在,我发现一个不错的解决方案,无论是否合适,都是通过MEF导出主线程的Dispatcher,然后允许所有插件导入它。这似乎是现在处理这类事情最干净的方式。