Multithreading 如何并行调用COM的方法

Multithreading 如何并行调用COM的方法,multithreading,com,Multithreading,Com,现在,我开发了一个ATL,它使用多线程进行编译。 COM dll是在我的C#winform应用程序中调用的。 COM接口如下所示:(在c#中) 在我的C#应用程序中: 我创建了两个名为TA和TB的线程。 在两个线程函数体中,我并行调用IMyInterface.RunFunction方法 但是,IMyInterface中的代码运行另一个线程。(不是TA或TB) 如果有一些设置强制COM代码在客户端线程中运行???您的winforms线程是STA,这意味着对winform线程中创建的COM对象的所有

现在,我开发了一个ATL,它使用多线程进行编译。 COM dll是在我的C#winform应用程序中调用的。 COM接口如下所示:(在c#中)

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

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


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

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

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

了解热it工作了解热it工作我尝试将主窗体线程模式从[StatThread]修改为[MTAThread]。但是,由于COM的原因,很多代码都会崩溃。因此,只需使用COM的“单元线程”模式。您不能更改winforms的线程模型。如果希望com对象使用另一个线程,则必须在另一个线程中创建它。如果该线程是MTA,则可以使用其他MTA线程中的com对象,而无需使用线程开关。我尝试将主窗体线程模式从[StatThread]修改为[MTAThread]。但是,由于COM的原因,很多代码都会崩溃。因此,只需使用COM的“单元线程”模式。您不能更改winforms的线程模型。如果希望com对象使用另一个线程,则必须在另一个线程中创建它。如果该线程是MTA,则可以使用其他MTA线程中的com对象,而无需使用线程开关。
public interface IMyInterface
{
    [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), 
    void RunFunction();
}