2015-01-02 28 views
1

我們正在從一臺Mainframe 3270客戶端切換到另一個 - Attachmate Reflection到Bluezone。 Reflection有一個很好的.NET API,但訪問Bluezone的唯一方法是通過COM。.NET後臺工作人員無法在前臺看到COM對象

我有在表示任一反射或Bluezone對象的溶液共同的類,並將其抓住現有的客戶機,不管它正好是,並與其通信。

大多數情況下,一切工作正常。當我通過任何項目訪問Bluezone COM對象時,它的功能就像Reflection一樣。

問題似乎是當我訪問後臺工作者內的Bluezone對象時。後臺工作人員似乎無法在主線程上看到COM對象。

當評估在調試模式下的COM對象,所有屬性的顯示與錯誤「功能評估需要所有的線程來運行」的錯誤。

enter image description here

我知道這是一個長鏡頭,但沒有人知道的方式來管理這個,所以我可以在後臺線程中訪問一個前景COM對象?

我對許多問題的供應商合作,他們也都非常好,但我有一種感覺,這可能是一個.NET/COM的事情。

我的最後一招是去除所有的後臺工作人員,使用戶處理畫面凍結,但我真的很討厭這樣做。我的另一個選擇是在後臺工作者中實例化COM對象,但是這個操作有一定的成本。我試圖Marshal.GetActiveObject(""),但它不起作用,或者我不知道應用程序的正確名稱。

如果任何人有與COM和後臺工作者類似的經驗,我會歡迎任何見解。

+0

您使用的是什麼.NET版本?您可以發佈代碼如何結合COM和BackgroundWorker? – Sievajet

回答

2

這非常符合COM組件的設計。與.NET類非常不同,如果組件告訴COM它不支持線程,則COM保持代碼線程安全。由ThreadingModel註冊表項配置。 COM自動確保通過自動封送調用來滿足此要求,相當於.NET Framework中的Invoke()。

所以,即使您從您的BackgroundWorker的DoWork的()事件處理函數調用,這些調用不工作線程上運行,他們執行的是對象的創建線程上。如果需要,COM創建一個STA線程。

調試器知道這一點,它可以「看到」他們就好了,它可以告訴任何監視表達式是不會能夠執行。由於它已經凍結了所有進程中的線程,除了調試器線程。所以不行,消息提醒你。

只是一個調試工件。也許更多的是,你的BGW可能效率不高,或者仍然導致UI線程掛起。查看this post獲取創建COM友好線程的代碼。

+0

我仍然在消化這個和所有相關的線程(即消息線程),但這是令人驚訝的東西。非常感謝你的洞察力。 – Hambone