将进程内COM-DLL从VSF异步调用到Excel加载项?
我正在为Microsoft Excel 2007/2010开发应用程序级VSTO 4加载项。 结果是一个基于windows窗体的DLL,使用.Net 4客户端配置文件 现在我必须使用遗留的COM-DLL。从.Net通过COM互操作设置引用和访问COM方法没有问题 但是我需要调用的(同步)方法可能需要一分钟或更长的时间才能返回 我知道你的答案: 使用工作线程 我使用任务并行库将长期操作放入辅助任务中,并保持GUI(Excel)响应将进程内COM-DLL从VSF异步调用到Excel加载项?,excel,com,asynchronous,vsto,add-in,Excel,Com,Asynchronous,Vsto,Add In,我正在为Microsoft Excel 2007/2010开发应用程序级VSTO 4加载项。 结果是一个基于windows窗体的DLL,使用.Net 4客户端配置文件 现在我必须使用遗留的COM-DLL。从.Net通过COM互操作设置引用和访问COM方法没有问题 但是我需要调用的(同步)方法可能需要一分钟或更长的时间才能返回 我知道你的答案: 使用工作线程 我使用任务并行库将长期操作放入辅助任务中,并保持GUI(Excel)响应 但是:inprocess COM调用(在辅助任务/线程中)似乎仍
但是:inprocess COM调用(在辅助任务/线程中)似乎仍然阻止了我的GUI线程
- 为什么??是因为Excel总是作为STA(单线程)运行吗 公寓
- 如何保持Excel GUI的响应李>
- 有没有办法使它真正异步
谢谢你的回答
Jörg最后,我找到了这个话题的答案: 我已经读了很多关于COM线程模型的书,然后与作为InProc服务器调用的COM-DLL的开发人员进行了交谈 我们一起更改了COM-DLL的配置:
- 旧(阻塞):单线程单元(STA),(ThreadingModel=单元)
- 新建(工作):多线程单元(MTA),(ThreadingModel=免费)
现在他们是。UI每次都有响应,对COM-DLL的调用仍然是在工作线程中完成的(如上所述,它是用户使用的线程)。最后,我找到了这个主题的答案: 我已经读了很多关于COM线程模型的书,然后与作为InProc服务器调用的COM-DLL的开发人员进行了交谈 我们一起更改了COM-DLL的配置:
- 旧(阻塞):单线程单元(STA),(ThreadingModel=单元)
- 新建(工作):多线程单元(MTA),(ThreadingModel=免费)
现在他们是。用户界面每次都有响应,对COM-DLL的调用仍然是在工作线程中完成的(如上所述,它是用户使用的线程)。我认为没有真正的解决方案。请参阅,这些都是很好的链接。所以答案是“是的,Excel始终作为STA运行”。这确实使得异步工作很难实现。我面临着一个非常类似的问题…你找到答案了吗?不是真的。我正在阻止Excel GUI并显示一个ProgressBar表单,我可以通过丑陋的Sleep/DoEvents继续移动它。但是对我的遗留COM-DLL(在工作线程中)的阻塞同步调用仍然无法中断。即使我使用(更难看的)TerminateThread或WorkerThread.Abort也不行。我做了一些实验,使用.NETWCF服务器组件作为遗留COM-DLL的宿主。这将是我认为最干净的方式,但游戏中还有一个组件……我认为没有真正的解决方案。请参阅,这些都是很好的链接。所以答案是“是的,Excel始终作为STA运行”。这确实使得异步工作很难实现。我面临着一个非常类似的问题…你找到答案了吗?不是真的。我正在阻止Excel GUI并显示一个ProgressBar表单,我可以通过丑陋的Sleep/DoEvents继续移动它。但是对我的遗留COM-DLL(在工作线程中)的阻塞同步调用仍然无法中断。即使我使用(更难看的)TerminateThread或WorkerThread.Abort也不行。我做了一些实验,使用.NETWCF服务器组件作为遗留COM-DLL的宿主。这将是我认为最干净的方式,但游戏中还有一个组件。。。