C# 如何使COM控件中的代码屈服于其他进程?

C# 如何使COM控件中的代码屈服于其他进程?,c#,multithreading,com,C#,Multithreading,Com,我正在一个新的C#应用程序中使用一个旧的COM组件(通信类库)。COM控件处理与某些仪器的通信。其中一个功能是下载数据,这取决于数据的大小,可能是一个相当长的操作。新的C#应用程序被设置为以线程的形式处理下载。问题是,当代码执行下载功能时,其他一切都冻结了,因此我无法在UI中单击“取消”按钮。我已经在每个块之后向下载代码添加了一个Sleep()(尝试从0到1000的所有参数)调用,但没有成功。让我困惑的是,如果我的下载线程不是调用COM控件,而是在C#中执行一个无限循环,我可以取消它,因为UI是

我正在一个新的C#应用程序中使用一个旧的COM组件(通信类库)。COM控件处理与某些仪器的通信。其中一个功能是下载数据,这取决于数据的大小,可能是一个相当长的操作。新的C#应用程序被设置为以线程的形式处理下载。问题是,当代码执行下载功能时,其他一切都冻结了,因此我无法在UI中单击“取消”按钮。我已经在每个块之后向下载代码添加了一个Sleep()(尝试从0到1000的所有参数)调用,但没有成功。让我困惑的是,如果我的下载线程不是调用COM控件,而是在C#中执行一个无限循环,我可以取消它,因为UI是活动的。有没有人想过我可以试着让下载线程产生什么效果


谢谢

如果COM组件的线程模型是STA,并且您正在主UI线程中创建它,然后调用方法从辅助线程下载数据,那么调用将被封送并在UI线程上执行,基本上会阻塞您的应用程序


STA COM组件需要在传输消息的STA线程中创建,因为对该组件的所有调用都将在创建该组件的线程中进行封送和执行,而与实际调用COM组件上的方法的线程无关。

COM组件的线程模型是什么?+1,无论这是否解决了OP问题我发现这个答案非常有用。