0

誰もこれに遭遇したことがありますか?Dispatcher は、アプリケーションの起動直後にキューの処理を停止する状態になることがあります。キューはビルドとビルドを繰り返すだけで、Dispatcher は何もしません。UI スレッドはレスポンシブです。最良の部分は、問題が非決定論的であることです。表示される場合もあれば、表示されない場合もあります。起動時に大きなファイルをロードすると、表示される可能性が高くなります。私のアプリは多くのことを行いますが、どこからデバッグを開始すればよいかわかりません。Dispatcher のコードを調べればよかったのですが、それはクローズド ソースのフレームワークを使用したときに得られるものです。くそーMSとくそーバギーSilverlight。

4

2 に答える 2

0

これはあなたの質問への回答ではありませんが、ディスパッチャのコードを調べるために使用できる Telerik の無料ツールを次に示します:
http://www.telerik.com/products/decompiler.aspx

Reflector を使用することもできますが、無料ではありません (14 日間の試用版):
http://www.reflector.net/

于 2012-12-11T09:12:43.940 に答える
0

Reflector は Dispatcher のデバッグに役立ちました (PDB を生成し、うまく統合します)。Silverlight ディスパッチャーは、ネイティブ コード ディスパッチャーのシン ラッパーにすぎないようです。ラッパーは、ネイティブ ディスパッチャーが Dispatcher でコールバックを呼び出すときに、BeginInvoke デリゲートのキューへの登録と実行のみを処理します。キューが空で、最初のデリゲートがキューに入れられると、Dispatcher は、可能であればいつでも Dispatcher をコールバックする必要があることを RuntimeHost に警告します。

バグに関する私の理論 (ブラウザ外で実行している場合は確実に発生しますが、ブラウザ内では不明です) は、Dispatcher が RuntimeHost を間違った時間にコールバックするように要求した場合 (たとえば、アプリケーションの起動が完了していないとき、または RuntimeHost が実行されているとき) です。多くの新しい UI 要素を処理しています...正確には言えません)、RuntimeHost はコールバックを忘れます。Dispatcher は二度とそれを要求することはなく、何の作業も行いません。

回避策は、DispatcherTimer を使用することです (これにはバグがないようです... Dispatcher がスタックしても、DispatcherTimer は刻み続けます)。Dispatcher の最も簡単な置き換えは、DispatcherTimer ベースのコードパスを含む Dispatcher の逆コンパイルされたソース コードをコピーすることです。

于 2012-12-11T22:26:35.217 に答える