ワーカースレッドから定期的にイベントを発生させる外部コンポーネントを使用しています。私のイベントハンドラでは、ディスパッチャを使ってメインスレッド上のメソッドを呼び出します。プログラムがシャットダウンし、外付け部品の廃棄()の、プログラム時々ハング(とのみタスクマネージャで見られるし、死滅させることができる)とき、これは、しかし...うまくワーカースレッドがメインスレッド上で何かを呼び出そうとするとデッドロックが発生する
private void HandleXYZ(object sender, EventArgs e)
{
...
if(OnTrigger != null)
dispatcher.Invoke(OnTrigger, new TimeSpan(0, 0, 1), e);
}
に動作します。
私は何が起きているのかを見ると、コンポーネントがメインスレッド(Dispose()メソッドのままです)に戻るのを待機しているように見えますが、ワーカースレッドはディスパッチャーが呼び出すのを待っています上記のメインスレッドへの呼び出し(ディスパッチャで停止します.Invoke-line)。
今のところ、私はシャットダウンの問題を、Invokeにタイムアウトを追加することで解決しましたが、これはうまくいくと思われますが間違っています。 これを行うためのよりクリーンな方法がありますか?シャットダウンする前に、メインスレッドに他のスレッドからのジョブにある程度の時間がかかるようにすることはできますか?
ディスパッチャがあるので...プログラムがシャットダウンを開始したときにすでに、待っている(かもしれない)、
PSを私はシャットダウンする前に、「切断」にイベントを試してみましたが、それは解決しません。外部コンポーネントとは、私がソースコードにアクセスできないということを意味します。
使用してください段落次回 – Shai
多く – Vedran