我們有一個嵌入在WinForms控件中的WPF控件,該控件又作爲ActiveX控件公開。該ActiveX最終用於由第三方開發的C++應用程序。WPF在WinForms中:在Dispatcher.Invoke上被阻塞,儘管UI線程在活
在某些時候,ActiveX控件的用戶界面變爲凍結狀態,而其餘的C++應用程序運行良好。經過一些調試後,我發現每次調用Application.Current.Dispatcher.Invoke時WPF控件都被阻塞了。但是,WinForms控件處理它的Control.Invoke的調用就好了。每當我暫停調試器時,我都可以看到UI線程正在C++應用程序中做一些工作,但似乎沒有被阻塞或等待任何東西。就好像UI線程突然莫名其妙地拒絕執行WPF代表。
當C++應用程序獨佔UI線程很長一段時間(幾分鐘)時,WPF控件有時會進入此狀態。我要做的第一件事就是使用一個不同的線程進行如此耗時的任務,但正如我已經說過的,我不對C++應用程序正在做什麼負責。無論如何,這不是我的WPF控件以這種方式行事的理由。我不知道如何解決這個問題,任何幫助,將不勝感激。
謝謝你的回答彼得。在你的例子中,主線程將被阻塞在SomeMethod的鎖上。就我而言,它並沒有被阻塞。真的沒有理由爲什麼我應該卡在一個Invoke上。正如我所說,在同一線程的WinForm中的調用工作得很好。顯然,WPF Dispatcher由於某種原因不再響應。 – Odsh
@odsh是的,這只是一個簡單的例子,你可以通過使用'Invoke'而不是'BeginInvoke'來獲得死鎖 - 儘管使用WinForms而不是WPF。 'Dispatcher.Invoke' /'BeginInvoke'也是如此。框架方法鎖定在許多你不瞭解也無法控制的地方 - 導致你遇到類似的情況。你嘗試過使用Dispatcher.BeginInvoke嗎? –
我不能在我的應用程序中用BeginInvokes替換所有的調用;有時這個電話必須是同步的。無論如何,我認爲沒有死鎖,否則主線程將被阻塞 - 他不是。如果像你所說的那樣,框架方法在某個地方被阻塞了,我想理解爲什麼並且糾正了這個問題。放棄調用,因爲他們可以在我不知道的地方隨機導致死鎖,這對我來說不是一個解決方案。 – Odsh