来自VSTO Excel Addin的进程COM-DLL的asynchronous调用?
我正在开发适用于Microsoft Excel 2007/2010的应用程序级VSTO 4 Addin。结果是使用.Net 4 Client Profile的基于Windows窗体的DLL。
现在我必须使用一个传统的COM-DLL。 设置引用并通过.Net通过COM-Interop访问COM方法是没有问题的。
但是我需要调用的(同步)方法可能需要一分钟或更长时间才能恢复。
我知道你的答案:使用工作者线程…
我已经使用任务并行库将长效操作放在工作任务中,并保持GUI(Excel)响应。
但是:进程中的COM调用(在工人任务/线程)似乎仍然阻止我的GUI线程。
- 为什么? 是因为Excel总是作为STA(单线程公寓)运行?
- 我如何保持Excel GUI的响应?
- 有没有办法让它真的asynchronous?
感谢任何答案,
约尔格
最后,我find了这个话题的答案:
我已经了解了很多关于COM线程模型的知识,然后和作为InProc-Server调用的COM-DLL的开发人员进行了交stream。
我们一起改变了COM-DLL的线程模型 :
- OLD(封锁):单线公寓(STA),(ThreadingModel =公寓)
- 新(工作):multithreading公寓(MTA),(ThreadingModel =免费)
由于我们在COM-DLL中有自己的同步机制,所以没有因通过标准的Windows消息队列进行同步而造成的问题。
问题是,即使UI线程闲置,即使它做了DoEvents ,重要的Windows消息( WM_Paint等)也没有被传递。
现在他们是。 UI每次都在响应,并且对工作线程的COM-DLL调用仍然在工作线程中完成(如上所述,它是由Task Parallel Library使用的ThreadPool线程)。