我正在构建一个VSTO加载项:我需要运行后台线程,但是这个线程需要访问COM组件(我已经实现了IMessageFilter以使这个消息尽可能安全).访问OLE或COM的所有线程都必须是STA我相信;因此,BackgroundWorker不在桌面上.
我很高兴使用普通线程并将ApartmentState设置为STA,但我还需要知道此线程何时完成,以便我可以更新一些UI内容.我不想Join()因为它会锁定UI(这就是我使用线程的全部原因!).
最好的做法是在我的线程方法结束时触发某种事件,并让事件完成我需要的完成的事情吗?
要么
民意调查更好吗?
while(!_threadFinishedStarting)
{
Application.DoEvents();
Thread.Sleep(100);
}
如上所述:C#.net – How to alert program that the thread is finished (event driven)?
非常感谢
最佳答案 在启动线程之前,可以调用Thread.SetApartmentState()来选择STA.您还必须提供消息循环,这是STA线程的要求.这往往是困难的,经常被忽略,你知道如果你的代码死锁或你的IMessageFilter抱怨,你需要一个.
请注意其他要求,只有在创建要在同一线程上使用的对象时,STA才有效.这往往是VSTO加载项中的问题,您通常希望使用Office对象模型提供的对象.您无法选择该对象的创建位置.
如果这是完全准确的那么你就不会创建自己的STA线程,因为无论如何调用都被编组了.在这种情况下,BGW就可以了,因为无论如何都无法取得成功,在这两种情况下都会调用该呼叫.线程安全没有免费午餐.