带有STA和COM的VSTO后台线程

本文关键字:VSTO 后台 线程 COM STA 带有 | 更新日期: 2023-09-27 18:25:11

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

我很乐意使用普通线程并将ApartmentState设置为STA,但我也需要知道这个线程何时完成,这样我才能更新一些UI内容。我不想Join(),因为它会锁定UI(这就是我使用线程的全部原因!)。

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

轮询更好吗

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

如前所述:C#.net-如何提醒程序线程已完成(事件驱动)?

非常感谢

带有STA和COM的VSTO后台线程

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

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

如果这是准确的,那么您就而不是提前创建自己的STA线程,因为调用无论如何都会被封送处理。在这种情况下,BGW很好,因为无论如何你都无法获得成功,在这两种情况下,调用都会被封送。螺纹安全没有免费午餐。