2

我正在为 Microsoft Excel 2007 / 2010 开发应用程序级别的 VSTO 4 插件。结果是使用 .Net 4 客户端配置文件的基于 Windows 窗体的 DLL。

现在我必须使用旧的 COM-DLL。设置引用并通过 .Net 中的 COM-Interop 访问 COM-Methods 是没有问题的。

但是我需要调用的(同步)方法可能需要一分钟或更长时间才能返回。

我知道你的答案:使用工作线程...

使用任务并行库将持久操作放入工作任务中并保持 GUI (Excel) 响应。


但是:inprocess COM-Call(在工作任务/线程中)似乎仍然阻塞了我的 GUI 线程。

  • 为什么?是因为 Excel 总是作为 STA(单线程单元)运行吗?
  • 如何保持 Excel GUI 响应?
  • 有没有办法让它真正异步?

感谢您的任何答案,

约尔格

4

1 回答 1

0

最后,我找到了这个话题的答案:

我已经阅读了很多关于 COM 线程模型的内容,然后与我称为 InProc-Server 的 COM-DLL 的开发人员进行了交谈。

我们一起改变了COM-DLL的线程模型:

  • OLD(阻塞):单线程单元(STA),(ThreadingModel=Apartment)
  • 新(工作):多线程单元(MTA),(ThreadingModel=Free)

由于我们在 COM-DLL 中有自己的同步机制,因此不会因标准 Windows 消息队列的同步丢失而导致问题。

问题是,即使 UI 线程也是空闲的,即使它执行了DoEvents,重要的窗口消息(WM_Paint等)也没有传递。

现在他们是。UI 每次都在响应,对 COM-DLL 的调用仍然在工作线程中完成(如上所述,它是Task Parallel Library使用的ThreadPool线程)。

于 2016-01-05T21:59:23.130 回答