UI スレッド/ディスパッチャに対してメソッドを永続的に非同期で呼び出しているとします。
while (true) {
uiDispatcher.BeginInvoke(new Action<int, T>(insert_), DispatcherPriority.Normal, new object[] { });
}
プログラムを実行するたびに、アプリケーションの GUI が呼び出しのフラッドにより約 90 秒後にフリーズし始めることがわかります(時間はさまざまですが、およそ 1 ~ 2 分です)。
この過負荷を早期に停止するために、この過負荷が発生した時点を正確に特定 (測定) するにはどうすればよいでしょうか?
付録 I:
私の実際のプログラムでは、無限ループはありません。終了する前に数百回反復するアルゴリズムがあります。すべての反復で、WPF アプリケーションの List コントロールに文字列を追加しています。私は while (true) { ... } 構造を使用しました。実際、アルゴリズムは正しく終了し、すべての (数百の) 文字列がリストに正しく追加されますが、しばらくすると、アルゴリズムが終了するまで GUI を使用できなくなります。その後、GUI は再び応答します。
付録 II:
私のプログラムの目的は、実行中に特定のアルゴリズムを観察することです。追加する文字列はログ エントリです。反復ごとに 1 つのログ文字列です。これらの追加操作を呼び出す理由は、アルゴリズムが UI スレッドとは別のスレッドで実行されているためです。UIスレッド以外のスレッドからUI操作を行うことができないという事実に追いつくために、ある種のThreadSafeObservableCollectionを構築しました(しかし、実際の問題を損なうため、このコードは投稿する価値がないと確信しています。メソッドの繰り返しの高速呼び出しを UI が処理できないことが原因だと思います。