我正在处理大型多线程C#应用程序处理COM互操作串。其他开发者和我有充分的机会不小心打电话 单线程公寓(STA) 来自MTA线程的COM对象,以及未创建它们的STA线程。性能低迷,跨线程编组是一个主要的嫌疑人。
是否有一个很好的方法来测试跨公寓编组?更好的是,是否有一种防御性编程技术来测试给定的COM对象属于这个线程的公寓?
我最接近的是一个关于可疑代码的防御声明:
Debug.Assert(Thread.CurrentThread.GetApartmentState() == ApartmentState.STA);
suspiciousComInterface.SomeMethod();
虽然这会警告我们,如果我们的 BackgroundWorker
线程正在调用STA对象,我特别担心STA线程正在使用在另一个STA线程中创建的COM Runtime Callable Wrapper(RCW)对象。
一位在线消息人士表示这是不可能的(http://www.pcreview.co.uk/forums/detecting-cross-apartment-com-calls-t2450589.html),CLR模糊了太多的COM代理对象,使它们在高级别可访问。
我无法相信这是唯一的答案。谢谢!