Silverlight Dispatcher锁定,停止处理队列中的任务

时间:2012-12-10 22:30:40

标签: silverlight

之前有没有遇到过这个? Dispatcher有时会在应用程序启动后立即进入状态,以便停止处理其队列。队列只是构建和构建,而Dispatcher什么都不做。 UI线程是响应式的。最好的部分是问题是非确定性的。有时会出现,有时则不然。如果我在启动时加载一个大文件,它更有可能出现。我的应用程序做了很多事情,我不知道从哪里开始调试。希望我能够检查Dispatcher的代码,但这就是使用闭源框架时的结果。该死的MS和该死的小车Silverlight。

2 个答案:

答案 0 :(得分:0)

这不能解答您的问题,但这里有来自Telerik的免费工具,您可以使用它来检查调度程序的代码:
http://www.telerik.com/products/decompiler.aspx

您也可以使用Reflector,但它不是免费的(14天试用):
http://www.reflector.net/

答案 1 :(得分:0)

Reflector帮助调试Dispatcher(它生成PDB并集成良好)。看起来Silverlight Dispatcher只是本机代码调度程序的瘦包装器。包装器只处理排队BeginInvoke委托并在本机调度程序调用Dispatcher上的回调时运行它们。当队列为空并且第一个委托排队时,Dispatcher会警告RuntimeHost它应该在有机会时回调Dispatcher。

我对错误的理论(在运行Out-of-Browser时肯定会发生,但在浏览器中不确定)是,如果Dispatcher在错误的时间请求RuntimeHost进行回调(例如,在应用程序启动未完成时或当RuntimeHost正在处理许多新的UI元素时......不能完全说出来,RuntimeHost会忘记回调。调度员从不再问过它,也从不做任何工作。

解决方法可能是使用DispatcherTimer(这似乎没有错误......当Dispatcher卡住时,我的DispatcherTimers继续滴答作响)。 Dispatcher最简单的替代方法可能是复制Dispatcher反编译的源代码,其中包含一个基于DispatcherTimer的代码路径。