4

thread.Abort() の後はどうなりますか??

私が持っていると言う:

Thread mWorker = new Thread(new ThreadStart(this.run));
..
mWorker.Start();

**where**

private void run() 
{
      Logger.d(TAG, "run()");

      ...
      try {
        while (this.mRunning){
          ...
        }
      } catch (ThreadAbortException tae){
           Logger.e(TAG,"some msg", tae);
           this.doSomething();
      } catch (IOException ioe){
           Logger.e(TAG,"some msg", ioe);
           this.doSomething();
      } catch (Exception e){
           Logger.e(TAG,"some msg", e);
           this.doSomething();
      } finally {
            gracefoulyClose();
      }

      Logger.d(TAG, "run() - ended");
}

スレッドはより複雑です..しかし、本質的なものはここに表示されます。では、Abort() が呼び出されるとどうなるでしょうか。私のキャッチは機能し、doSomething() の呼び出しを続行しますか?

私はまだコンソールで受け取っているので:

A first chance exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll
An exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll but was not handled in user code

しかし、私にはそのためのキャッチがあります。私じゃないの??

4

3 に答える 3

7

ドキュメントから:

スレッドを破棄するために Abort メソッドが呼び出されると、共通言語ランタイムは ThreadAbortException をスローします。 ThreadAbortException はキャッチできる特殊な例外ですが、キャッチ ブロックの最後で自動的に再度発生します。この例外が発生すると、ランタイムはスレッドを終了する前にすべての finally ブロックを実行します。スレッドは、finally ブロックで無制限の計算を実行したり、Thread.ResetAbort を呼び出してアボートをキャンセルしたりできるため、スレッドが終了するという保証はありません。中止されたスレッドが終了するまで待ちたい場合は、Thread.Join メソッドを呼び出すことができます。Join は、スレッドが実際に実行を停止するまで戻らないブロッキング呼び出しです。

つまり、ThreadAbortException実行の catch ブロックの後、例外が再発生するため、最後のロガー行 (例: Logger.d(TAG, "run() - ended")) は実行されません。しかし、 への呼び出しthis.doSoemthingは の catch ブロックにあるため、ThreadAbortException実行されます。

finallyブロック実行されることにも注意してください(上記のドキュメントを参照してください)。

于 2012-05-11T20:37:15.783 に答える
0

スレッドの実行が完了する前にコンテキストが終了しているため、ThreadAbortException が発生しています。終了する前に、スレッドが完了するのを待つ必要があります。終了したい場合は、スレッドがプログラムの終了を希望するシグナルを受信 (およびそれに基づいて動作) できることを確認する必要があります。その後、プログラムの実行を管理するコードは、スレッドが完了するまで待機する必要があります。

if (mThread != null && mThread.IsAlive) {
    mThread.Join();
}

スレッドが終了しないことが心配な場合は、タイムアウトでオーバーロードを使用し、タイマーにヒットした場合は明示的にスレッドを強制終了します。

于 2012-05-11T21:22:20.343 に答える