Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 已与其基础RCW分离的COM对象不能与TPL和跨线程COM对象一起使用_C#_Multithreading_Com_Task Parallel Library - Fatal编程技术网

C# 已与其基础RCW分离的COM对象不能与TPL和跨线程COM对象一起使用

C# 已与其基础RCW分离的COM对象不能与TPL和跨线程COM对象一起使用,c#,multithreading,com,task-parallel-library,C#,Multithreading,Com,Task Parallel Library,我在Wpf中有一个主类,所以它在MTA中,我必须处理需要在STA中的COM对象 因此,我有以下代码来创建一个对象的实例 COMObject localCOMObject; Thread thread = new Thread(() => { try { localCOMObject = new COMObject(); } finally { DidFinish= 1; } }); thread.SetApartmentState(ApartmentState.STA);

我在Wpf中有一个主类,所以它在MTA中,我必须处理需要在STA中的COM对象

因此,我有以下代码来创建一个对象的实例

COMObject localCOMObject;

Thread thread = new Thread(() =>
{
   try { localCOMObject = new COMObject(); }
   finally { DidFinish= 1; }
});

thread.SetApartmentState(ApartmentState.STA);
thread.Start();
我还有一个列表对象,它引用了这个对象(WorkingObjects)

在我的Execute方法中,我使用我的COMObject对象,这是我得到异常的时候:

无法使用已与其基础RCW分离的COM对象

当我的代码是:

await Task.Run(() => 
{
  COMObject localCOMObject = new COMObject();
  Parallel.ForEach(WorkingObjects, WorkingObject=>
  {
      WorkingObject=localCOMObject ;
      WorkingObject.Execute();
  });
});
await Task.Run(() => 
但是现在我需要在我的任务之外做一些事情

我在Wpf中有一个主类,所以它在MTA中(…)

你确定吗?Windows窗体和WPF专门用于在STA中运行

(…)我必须处理需要在STA中的COM对象

COM对象不能超过其单元。STA不能超过其线程

创建一个STA线程,然后创建一个COM对象,最后这个线程退出。如果该对象注册为在STA中生存,那么您的对象现在处于未定义状态,并且完全不可靠

当我的代码是:

await Task.Run(() => 
{
  COMObject localCOMObject = new COMObject();
  Parallel.ForEach(WorkingObjects, WorkingObject=>
  {
      WorkingObject=localCOMObject ;
      WorkingObject.Execute();
  });
});
await Task.Run(() => 
(……)

这是因为该对象是在MTA单元(线程池线程使用MTA)中创建的,或者是在使用该对象时处于活动状态的STA中创建的


如果对象注册时ThreadingModel设置为“两者”或“自由”,则该对象位于MTA中。如果将对象设置为Single,则它将获取在使用对象之前未销毁的对象。

COM对象与创建它的线程具有亲缘关系。因此,当线程退出时,COM对象就死定了。还有更多错误的假设,WPF代码不在MTA中运行。STA线程必须始终泵送消息循环。并且Parallel.ForEach()不能在线程不安全且调用被序列化的对象上完成任何操作。很难帮助你。happy STA线程的示例代码。当我调用Parallel时,我的主线程仍然存在。ForEach plus localCOMObject在另一个线程中初始化,当我使用它时,它仍然在我的主线程中工作。