将进程内COM-DLL从VSF异步调用到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调用(在辅助任务/线程中)似乎仍

我正在为Microsoft Excel 2007/2010开发应用程序级VSTO 4加载项。 结果是一个基于windows窗体的DLL,使用.Net 4客户端配置文件

现在我必须使用遗留的COM-DLL。从.Net通过COM互操作设置引用和访问COM方法没有问题

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

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

使用任务并行库将长期操作放入辅助任务中,并保持GUI(Excel)响应


但是:inprocess COM调用(在辅助任务/线程中)似乎仍然阻止了我的GUI线程

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

谢谢你的回答


Jörg

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

我已经读了很多关于COM线程模型的书,然后与作为InProc服务器调用的COM-DLL的开发人员进行了交谈

我们一起更改了COM-DLL的配置:

  • 旧(阻塞):单线程单元(STA),(ThreadingModel=单元)
  • 新建(工作):多线程单元(MTA),(ThreadingModel=免费)
因为我们在COM-DLL中有自己的同步机制,所以通过标准Windows消息队列丢失同步不会导致任何问题

问题是,即使UI线程是空闲的,即使它是空闲的,重要的windows消息(,等等)也没有传递


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

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

我已经读了很多关于COM线程模型的书,然后与作为InProc服务器调用的COM-DLL的开发人员进行了交谈

我们一起更改了COM-DLL的配置:

  • 旧(阻塞):单线程单元(STA),(ThreadingModel=单元)
  • 新建(工作):多线程单元(MTA),(ThreadingModel=免费)
因为我们在COM-DLL中有自己的同步机制,所以通过标准Windows消息队列丢失同步不会导致任何问题

问题是,即使UI线程是空闲的,即使它是空闲的,重要的windows消息(,等等)也没有传递


现在他们是。用户界面每次都有响应,对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的宿主。这将是我认为最干净的方式,但游戏中还有一个组件。。。