2

2 つのスレッド: メイン (GUI) とワーカー。ワーカーは、を使用してメインに更新を要求しDispatcher.Invoke(...)ます。ある時点で、ユーザーの介入の結果として、 を使用してワーカーを中止する必要がありThread1.Abort()ます。しかし、次の順序でデッドロックが発生するようです。

  1. T1 がアクションを呼び出す
  2. メインスレッドが T1 を中止します

ここに画像の説明を入力

私は知っています、Abortingは悪です(どうすればいいですか?CheckIfCanceled()2行ごとに挿入しますか??)が、それが必要であると仮定すると、どうすればデッドロックを防ぐことができますか?

4

1 に答える 1

0

Windows スレッド モデルでは、実行コンテキストの外部からスレッドを中止することはできません。ワーカー スレッドにそのワーカー メソッドを終了するように通知する必要があります (その後、スレッドを終了します)。これを実現するには、CancellationToken やその他のクロス スレッド フラグなどを使用できます。Thread.Abort() は例外をスローしますが、ロック マルチスレッド アルゴリズムで使用する場合、特にこれを実行する時間が保証されるわけではありません。

あなたにとって最良の代替手段は、 using を呼び出しBeginInvoke()、後で a を使用しWaitHandleて答えを待つことです (これにより、ループで待機する CPU サイクルを消費せずにスレッドを中断します)。メインスレッドが呼び出し要求に応答すると、WaitHandleそのスレッドを介して再開できることを通知します。フラグを使用して、再開時に終了する必要があるかどうかをスレッドに示します。

于 2015-08-28T05:31:59.520 に答える