我有一個調用COM組件的c#靜態函數。從.Net調用COM調用掛起線程
當從一個普通的WPF應用程序調用此函數時,它會正確返回。 的代碼可能是這個樣子:
var result = MyClass.StaticCall();
Debug.WriteLine("Hurrah!");
當我打電話的代碼,該變量將被設置和調試消息輸出符合市場預期。
但是,如果我在一個線程中包裝相同的調用,它永遠不會返回。失敗的代碼可能如下所示:
var foo = new Thread(new ThreadStart(() =>
{
var result = MyClass.StaticCall();
Debug.WriteLine("Hurrah!");
}));
foo.Start();
while (foo.IsAlive)
{
}
在這種情況下,StaticCall將不會返回並且線程無限期地被阻塞。
什麼可能導致此行爲?
附加信息:
- 設置線程的公寓狀態沒有什麼區別。
- visual studio輸出窗口中的最後一條消息是COM互操作已加載的通知。
- 所有對COM的調用都被隔離在一個線程中。
* foo.Start()之後的代碼是什麼?這很重要。主線程不會閒置時,死鎖很常見。 –
@Hans我編輯了這個問題來添加這個細節。 –