小编Sco*_*t B的帖子

在C#中通过COM RCW对象检测跨线程编组

我正在处理大型多线程C#应用程序处理COM互操作串.其他开发人员和我有充分的机会不小心从MTA线程调用单线程公寓(STA) COM对象,并从他们未创建的STA线程.性能低迷,跨线程编组是主要的嫌疑.

是否有一个很好的方法来测试跨公寓编组?更好的是,是否有一种防御性编程技术来测试给定的COM对象属于这个线程的公寓?

我最接近的是一个关于可疑代码的防御声明:

Debug.Assert(Thread.CurrentThread.GetApartmentState() == ApartmentState.STA);
suspiciousComInterface.SomeMethod();
Run Code Online (Sandbox Code Playgroud)

虽然如果我们的BackgroundWorker线程正在调用STA对象,这将警告我们,我特别担心STA线程正在使用在另一个STA线程中创建的COM运行时可调用包装器(RCW)对象.

一个在线源认为,这是不可能的(http://www.pcreview.co.uk/forums/detecting-cross-apartment-com-calls-t2450589.html),在CLR掩盖了太多的COM代理的使对象在高级别可访问的对象.

我无法相信这是唯一的答案.谢谢!

c# com multithreading .net-4.0 marshalling

11
推荐指数
1
解决办法
1510
查看次数

标签 统计

.net-4.0 ×1

c# ×1

com ×1

marshalling ×1

multithreading ×1