2012-01-05 85 views
1

现在,我开发了一个用_ATL_MULTI_THREADED编译的ATL。 COM DLL在我的C#winform应用程序中被调用。 COM接口是这样的:(在C#)如何并行调用COM的方法

public interface IMyInterface 
{ 
    [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), 
    void RunFunction(); 
} 

在我的C#应用​​程序: 我创建了两个线程名为TA和TB。 在这两个线程函数体中,我并行地调用了IMyInterface.RunFunction方法。

但是,IMyInterface运行代码另一个线程。(不TA或TB)

如果有一些设置以强制COM代码运行在客户端的线程???

+0

理解它的工作原理[了解和使用COM线程模型](http://msdn.microsoft.com/en-us/library/ms809971.aspx) – lsalamon 2012-01-05 12:42:29

回答

1

您的winforms线程是STA,这意味着所有调用,无论线程,在com中创建的winform线程对象都将使用winform线程。在TA或TB中创建com对象

+0

因此,如何禁用STA。 – 2012-01-06 00:49:48

+0

我尝试将主窗体线程模式从[STAThread]修改为[MTAThread]。但是,很多代码会因为COM原因而崩溃。因此,只需使用COM的“公寓线程”模式即可。 – 2012-01-06 03:51:41

+0

您无法更改winforms的线程模型。如果你想com对象使用另一个线程,你必须在另一个线程中创建它。如果该线程是MTA,则可以在没有线程切换的情况下使用来自其他MTA线程的com对象。 – adrianm 2012-01-07 13:28:25