.NET背景工作者无法在前景中看到COM对象

时间:2015-01-02 22:33:08

标签: c# com backgroundworker

我们正在从一个Mainframe 3270客户端切换到另一个 - Attachmate Reflection to Bluezone。 Reflection有一个很好的.NET API,但访问Bluezone的唯一方法是通过COM。

我在解决方案中有一个代表Reflection或Bluezone对象的公共类,它抓住现有的客户端,无论它是什么,并与之通信。

在大多数情况下,一切正常。当我通过任何项目访问Bluezone COM对象时,它的功能就像Reflection。

问题似乎是当我在后台工作程序中访问Bluezone对象时。后台工作者似乎无法在主线程上看到COM对象。

在调试模式下评估COM对象时,所有属性都显示错误的"函数评估需要所有线程运行"错误。

enter image description here

我知道这是一个很长的镜头,但有没有人知道管理这个的方法,所以我可以访问后台线程中的前台COM对象?

我在很多问题上与供应商合作过,他们很棒,但我觉得这可能是.NET / COM的事情。

我的最后一招是删除所有后台工作人员并让用户处理屏幕冻结,但我真的很讨厌这样做。我的另一个选择是在后台工作程序中实例化COM对象,但是与此操作相关的成本。我尝试Marshal.GetActiveObject(""),但要么它不起作用,要么我不知道应用程序的正确名称。

如果有人与COM和后台工作者有类似的经历,我会欢迎任何见解。

1 个答案:

答案 0 :(得分:2)

这非常适用于COM组件。与.NET类非常不同,如果组件告诉COM它不支持线程,则COM保持代码线程安全。由ThreadingModel注册表项配置。并且COM通过自动封送调用来自动确保满足此要求,相当于.NET Framework中的Invoke()。

因此,即使您使用BackgroundWorker的DoWork()事件处理程序进行调用,这些调用也不会在工作线程上运行,而是在创建对象的线程上执行。如果需要,COM创建的STA线程。

调试器知道这一点,它可以"看到"它们很好,它可以告诉任何监视表达式无法执行。因为它已经冻结了 all 进程中的线程,除了调试器线程。所以没有办法,这个消息会提醒你。

只是一个调试工件。也许更多,您的BGW可能不是非常有效或仍然导致UI线程挂起。检查this post以查找创建COM友好线程的代码。