ワーカー スレッドから定期的にイベントを発生させる外部コンポーネントを使用しています。私のイベント ハンドラーでは、Dispatcher を使用して、メイン スレッドでいくつかのメソッドを呼び出します。これはうまく機能します...
private void HandleXYZ(object sender, EventArgs e)
{
...
if(OnTrigger != null)
dispatcher.Invoke(OnTrigger, new TimeSpan(0, 0, 1), e);
}
ただし、プログラムがシャットダウンし、外部コンポーネントが Dispose() を実行すると、プログラム がハングすることがあります (タスク マネージャーでのみ確認および強制終了できます)。
何が起こっているのかを見ると、「コンポーネント」はイベントがメインスレッドに戻るのを待っているように見えます(Dispose()メソッドにとどまります)が、ワーカースレッドはディスパッチャーが言及された呼び出しを呼び出すのを待っていますメイン スレッド (dispatcher.Invoke-line でハングします)。
今のところ、Invoke にタイムアウトを追加することでシャットダウンの問題を解決しました。このようなことを行うためのよりクリーンな方法はありますか? シャットダウンする前に、メイン スレッドが他のスレッドからのジョブに時間を費やすように強制することはできますか?
シャットダウンする前にイベントを「切断」しようとしましたが、プログラムがシャットダウンを開始したときにディスパッチャーが既に待機しているため、役に立ちません...
PS: 外部コンポーネントとは、ここではソース コードにアクセスできないことを意味します...