c#强制从MTA线程调用进程外COM服务器回调到同一个线程

时间:2014-12-12 02:33:23

标签: c# multithreading com sta mta

我正在编写一个由第三方应用程序调用的DLL。 从MTA线程调用DLL,并且必须在同一线程上完成对第三方应用程序的任何调用。 从我的应用程序我需要调用一个进程外的COM服务器,我想使用传递给COM服务器的对象从这个COM服务器回调第三方应用程序。

e.g。

// Called from third party MTA thread
// apiObject must always be called from same thread that called EntryPoint
void EntryPoint(API apiObject)
{
   IMyComClass myComObj = createComObject();
   myComObj.doStuff(apiObject);
}

Class MyComClass : IMyComClass
{
   public void doStuff(API apiObject)
   {
      apiObject.doSomething();
   }
}

现在,如果我可以将线程更改为STA,它可以正常工作,但不幸的是,这是我无法控制的。

有什么简单的方法可以强制从COM服务器返回的调用是在同一个线程上吗?

请注意,调用应用程序不是Windows窗体或WPF应用程序,它是无窗口服务。

我唯一能想到的是创建一个新的工作线程,我从中调用COM服务器并实现自己的事件队列,然后循环等待EntryPoint内的API调用。然后我可以将代理从工作线程调用到事件队列的API调用,确保在EntryPoint中处理队列时从正确的线程调用它们。

对于应该很常见的事情来说,这似乎是一个非常丑陋和复杂的解决方案...... 有一个简单的(r)解决方案吗?

0 个答案:

没有答案