0

我之前的问题(SelectedIndex is un changed in tabcontrol - Dispatcher issue)并没有走得太远,我怀疑我一开始就走错了路。

我的程序中有 3 个给定:

  1. 我有一个 WPF 主窗口。
  2. 我连接到一个单独的应用程序(不同的进程),该应用程序实现了一个 COM 服务器,可以在不同时间调用该服务器以执行耗时的计算,其结果将显示在我的窗口中。
  3. 我不希望主窗口在等待这些计算结束时冻结。事实上,操作员应该可以自由地继续使用该程序,尽管某些控件可能会在异步操作结束之前被禁用。

在我看来,要实现上述要求,我需要有一个单独的线程专门用于处理 COM 请求,并且该线程必须是 STA。我以某种方式调用这个线程来做一些事情,而这个线程以某种方式调用 GUI 线程来更新东西。从技术上讲,我不清楚如何实现这一点。

两个问题:如何在线程之间实现这些调用?什么是干净的架构?

4

1 回答 1

0

根据您的 COM 服务器,您可以使用 MTA 或 STA 线程模型。STA 单线程单元是最简单易用的单元,我建议您首先使用它,除非您确定您的 COM 支持 MTA 并且您需要使用 MTA。

调用长时间运行的 COM 对象的一种安全方式是以下标准模式: - 从 UI 线程启动一个新线程,您的 COM 对象将从该线程中被调用。您可以使用任务或线程。将线程单元更改为 STA:System.Threading.Thread.CurrentThread.ApartmentState = ApartmentState.STA

  • 然后,您可以从该线程实例化并正常运行您的 COM 对象。当它完成或当您从中获取需要在主 UI 线程上传递的事件时,您会从传递数据的代码中引发一个事件(不要传回 COM 对象,您需要将数据与它解耦,因为它属于另一个线程),您的 UI 线程将拦截该线程。

  • 当您返回事件时,在您的 UI 线程上,如果您使用 WinForm,则需要使用 InvokeRequired / BeginInvoke。我不确定 WPF,但我希望您也需要将回调与 UI 线程同步。

于 2014-12-12T13:35:04.053 回答