2012-12-10 79 views
0

有沒有人遇到過這個?分派器有時會在應用程序啓動後立即進入狀態,以停止處理其隊列。隊列只是構建和構建的,分派器什麼也不做。 UI線程是響應式的。最好的部分是這個問題是非確定性的。有時會出現,有時卻不會。如果我在啓動時加載一個大文件,則更有可能出現。我的應用程序做了很多事情,我不知道從哪裏開始調試。希望我只能檢查Dispatcher的代碼,但這就是您在使用閉源框架時所得到的結果。該死的MS和該死的Silverlight。Silverlight調度器鎖定,停止隊列中的處理任務

+0

嗨@Aleksandr你有沒有得到解決這個問題的方法?如果您可以分享您可能獲得的任何解決方案,我們將非常感激。 –

+0

@SarafTalukder嗯,我在答案中寫了一些東西。你注意到了嗎?無論如何,我現在不記得這個問題了。 –

回答

0

這不回答你的問題,但這裏是從Telerik的一個免費的工具,您可以使用檢查的調度程序代碼:
http://www.telerik.com/products/decompiler.aspx

你也可以使用反射,但它不是免費的(14天試用版):
http://www.reflector.net/

+0

好主意!令人驚訝的是,Dispatcher代碼非常簡短。但是..什麼是與調試器一起使用反編譯代碼的最佳方式?我似乎記得其中一個工具(也許是DotPeek)可以讓你自動執行該操作,但我在VS 2012中看不到該選項。 –

0

Reflector幫助調試Dispatcher(它生成PDB並集成良好)。看起來Silverlight Dispatcher只是一個本地代碼調度器的薄包裝器。包裝器只處理BeginInvoke委託的排隊,並在本地調度器在Dispatcher上調用回調時運行它們。當隊列爲空並且第一個委託排隊時,Dispatcher會提醒RuntimeHost它應該在發生機會時回調Dispatcher。

我對這個bug的理論(當運行Out-of-Browser時肯定會發生,但不確定是否在瀏覽器中)是,如果Dispatcher請求RuntimeHost在錯誤的時間回調(例如,應用程序啓動未完成或者當RuntimeHost正在處理很多新的UI元素......不能說完全),RuntimeHost忘記了回調。調度員從不再次詢問,從不做任何工作。

解決方法可能是使用DispatcherTimer(這似乎沒有錯誤...當Dispatcher卡住了,我的DispatcherTimers繼續滴答滴答)。 Dispatcher的最簡單的替代方案可能是複製Dispatcher反編譯的源代碼,其中包含一個基於DispatcherTimer的代碼路徑。