簡體   English   中英

UI線程阻止調用COM對象的后台線程

[英]UI thread is blocking a background thread calling a COM object

我正在開發一個通過第三方COM庫與外部設備通信的應用程序。 我試圖讓所有與設備的通信都通過后台線程來防止通信問題搞砸了我的應用程序,並擺脫了在UI線程中進行通信所引入的一些其他復雜性。

問題是,每當發生導致主UI線程阻塞的事情(即MessageBox.Show被調用甚至只是在屏幕上移動窗口)時,與后台線程上的設備的通信也會停止。

是否有任何方法(缺少一個完全獨立的過程)將兩個線程分開,使它們不會相互干擾? (注意,完全相同的代碼與一些數學計算,以減慢一點工作得很好,只有當我使用COM庫我有問題)

如果滿足以下兩個條件,則可以解釋您觀察到的行為。

  • 第三方COM庫旨在在單線程單元中運行
  • 您正在UI線程上的庫中創建類的實例

由於UI線程在STA(單線程單元)中運行並且在該線程上創建了COM類,因此對來自除UI線程之外的線程的類的所有調用將被編組到UI線程本身上。 如果UI線程被阻止,那么對COM類的所有調用也將被阻止。

我想填寫Brian的回答。

可能是你忘記為你的工作線程調用TrySetApartmentState(ApartmentState.STA) 如果是這樣,我相信您的工作線程默認在MTA中運行,並且所有STA對象都在單獨的STA線程(甚至可能是主UI線程)上創建。 您應該確保您的工作線程加入STA並查看是否有幫助。

除此之外,COM對象可以注冊為主STA。 IIRC,這種情況並不常見。 主STA對象必須存在於主UI線程中。 如果這恰好是您的情況,我相信您唯一的選擇是求助於工作進程而不是工作線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM