UI线程阻止调用COM对象的后台线程

Alp*_*ilo 4 c# com multithreading

我正在开发一个通过第三方COM库与外部设备通信的应用程序.我试图让所有与设备的通信都通过后台线程来防止通信问题搞砸了我的应用程序,并摆脱了在UI线程中进行通信所引入的一些其他复杂性.

问题是,每当发生导致主UI线程阻塞的事情(即MessageBox.Show被调用甚至只是在屏幕上移动窗口)时,与后台线程上的设备的通信也会停止.

是否有任何方法(缺少一个完全独立的过程)将两个线程分开,使它们不会相互干扰?(注意,完全相同的代码与一些数学计算,以减慢一点工作得很好,只有当我使用COM库我有问题)

Bri*_*eon 11

如果满足以下两个条件,则可以解释您观察到的行为.

  • 第三方COM库旨在在单线程单元中运行
  • 您正在UI线程上的库中创建类的实例

由于UI线程在STA(单线程单元)中运行并且在该线程上创建了COM类,因此对来自除UI线程之外的线程的类的所有调用将被编组到UI线程本身上.如果UI线程被阻止,那么对COM类的所有调用也将被阻止.

  • 做到了。在移交给工作线程之前,先在UI线程中创建了COM对象。当我将其移至工作线程本身时,问题就消失了。 (2认同)