UI には独自のスレッドがあります。これは、UI を更新する別のスレッドを持つことができないことを意味します(WPF GUI にも同じことが適用されることに注意してください)。BackgroundWorkerを使用してバックグラウンド スレッドで DB を呼び出し、終了時に UI を更新することをお勧めします。これは推奨されるアーキテクチャです。
アプリケーションは、ページをロードし、すべての画像を非同期で正常にロードするブラウザとして動作し、グラフが動的に表示されるのを確認できます。これにより、通常、ユーザーはアプリケーションがより速く感じられます。
16 のバックグラウンド ワーカーが DB からの応答からハングアップしただけであっても、最高でなくてもまったく問題ありません。バックグラウンド ワーカーを使用すると、スレッド マーシャリングが自動的に行われるという利点があります。チャート バインド ロジックをRunWorkerCompletedイベント ハンドラーに配置し、データ取得ロジックをDoWorkイベント ハンドラーに配置するだけです。
以下にスニペットを示します。
BackgroundWorker bgw = new BackgroundWorker();
bgw.DoWork += (sender, e) => { //data retrieving logic here }
bgw.RunWorkerCompleted+= (sender, e) => { //bind results to chart here if no canceled nor errors }
bgw.RunWorkerAsync();//starts async execution
このようにすることで、非同期の UI パターンを実装できます。これは、リアクティブなアプリケーションにとって本当に必須です。
追加
完全を期すために、「ハングしているエージェント」はデータベースであるため、非同期 ADO.NET 呼び出しを検討することもできます。これは、スレッドとコンテキストの切り替えの数を最小限に抑えるために内部でI/O Completion Port メカニズムを使用するため、リソースの使用に関して実行できる最善の方法ですが 、シナリオでは少し過剰に設計されている可能性があります。ado.net と I/O 完了ポートの詳細については、こちらを参照してください。「真の非同期 I/O」の段落を参照してください。