如何使COM控件中的代码产生其他进程?

时间:2011-03-22 14:27:49

标签: c# multithreading com

我在新的C#应用​​程序中使用旧的COM组件(通信类库)。 COM控件处理与我们的一些仪器的通信。其中一个功能是下载数据,根据数据的大小,数据可能是一个相当冗长的操作。新的C#应用​​程序设置为处理作为线程的下载。问题是,当代码执行下载功能时,其他所有内容都会冻结,因此我无法单击UI中的“取消”按钮。我添加了一个Sleep()(尝试从0到1000的所有内容作为参数)在每个块之后调用下载代码而没有成功。令我困惑的部分是,如果我的下载线程,而不是调用COM控件,只是在C#中执行无限循环,我可以取消,因为UI是活动的。有没有人想过我可以尝试使下载线程产量?

由于

1 个答案:

答案 0 :(得分:1)

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

STA COM组件需要在一个泵送消息的STA线程中创建,因为对组件的所有调用都将被编组并在创建它的线程中执行,而该线程实际上是调用COM组件上的方法。

相关问题