C# .NET后台工作人员可以';在前景中看不到COM对象

C# .NET后台工作人员可以';在前景中看不到COM对象,c#,com,backgroundworker,C#,Com,Backgroundworker,我们正在从一个大型机3270客户机切换到另一个客户机——将Attachmate反射切换到Bluezone。反射有一个很好的.NETAPI,但是访问Bluezone的唯一方法是通过COM 我在解决方案中有一个公共类,它表示反射或Bluezone对象,它捕获现有客户机,不管它是什么,并与之通信 在大多数情况下,一切正常。当我通过任何项目访问Bluezone COM对象时,它的功能就像反射一样 问题似乎是当我在后台工作程序中访问Bluezone对象时。后台工作线程似乎无法在主线程上看到COM对象 在调

我们正在从一个大型机3270客户机切换到另一个客户机——将Attachmate反射切换到Bluezone。反射有一个很好的.NETAPI,但是访问Bluezone的唯一方法是通过COM

我在解决方案中有一个公共类,它表示反射或Bluezone对象,它捕获现有客户机,不管它是什么,并与之通信

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

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

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

我知道这很难实现,但有人知道如何管理它,以便我可以在后台线程中访问前台COM对象吗

我曾与供应商就许多问题进行过合作,这些问题都非常出色,但我觉得这可能是一个.NET/COM问题

我最后的办法是删除所有的后台工作人员,让用户处理屏幕冻结的问题,但我真的不愿意这样做。我的另一个选择是在后台工作程序中实例化COM对象,但这一操作会带来成本。我试图
封送.GetActiveObject(“”)
,但要么它不起作用,要么我不知道应用程序的正确名称


如果有人对COM和后台工作人员有过类似的经验,我欢迎有任何见解。

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

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

调试器知道这一点,它可以很好地“看到”它们,它可以告诉任何监视表达式都无法执行。因为它冻结了进程中除调试器线程之外的所有线程。这条信息提醒你,没有什么可以做的


只是一个调试工件。也许更重要的是,您的BGW可能不是很有效,或者仍然会导致UI线程挂起。检查创建COM友好线程的代码。

您使用的是哪个.NET版本?你能把你如何结合COM和BackgroundWorker的代码贴出来吗?我仍然在消化这个和所有相关的线程(也就是消息线程),但这是令人惊奇的东西。非常感谢您的洞察力。