使用STA和COM进行VSTO后台线程处理

时间:2013-07-28 21:09:50

标签: c# multithreading com vsto sta

我正在构建一个VSTO加载项:我需要运行后台线程,但是这个线程需要访问COM组件(我已经实现了IMessageFilter以使这个消息传递尽可能安全)。访问OLE或COM的所有线程都必须是STA我相信;因此,BackgroundWorker不在桌面上。

我很高兴使用普通线程并将ApartmentState设置为STA,但我还需要知道此线程何时完成,以便我可以更新一些UI内容。我不想Join()因为它会锁定UI(这就是我使用线程的全部原因!)。

最好的做法是在我的线程方法结束时触发某种事件,让事件完成我需要的事情吗?

OR

民意调查是否更好

   while(!_threadFinishedStarting)
   {
        Application.DoEvents();
        Thread.Sleep(100);
   }

如上所述:C#.net - How to alert program that the thread is finished (event driven)?

非常感谢

1 个答案:

答案 0 :(得分:3)

在启动线程之前,可以调用Thread.SetApartmentState()来选择STA。您还必须提供消息循环,这是STA线程的要求。这往往是困难的,经常被忽略,你知道如果你的代码死锁或你的IMessageFilter抱怨,你需要一个。

请注意另一个要求,只有在创建要在同一个线程上使用的对象时,STA才有效。这往往是VSTO加载项中的问题,您通常希望使用Office对象模型提供的对象。您无法选择创建该对象的位置。

如果那是完全正确的那么你就是而不是创建自己的STA线程,因为无论如何调用都被编组了。在这种情况下,BGW就可以了,因为无论如何都无法取得成功,在这两种情况下都会调用该呼叫。线程安全没有免费午餐。