2012-05-11 14 views
4

thread.Abort()の後に何が起こるか?C#スレッド中止例外

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"); 
} 

スレッドはより複雑です..しかしesentialがここに表示されます。

は私が持っていると言います。では、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 

しかし、私は、そのためのキャッチを持っています。私はしないでください? docから

答えて

7

:呼び出しがスレッドを破壊するためにAbortメソッドに行われた場合

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

換言すれば、ThreadAbortException実行のためのあなたのcatchブロックの後に、例外が再提起であるので、あなたの最後のロガーライン(例えばLogger.d(TAG, "run() - ended"))が実行されることはありません。しかしthis.doSoemthingへのコールはThreadAbortExceptionのキャッチブロックにあるので、になります。

finallyブロックとなります(上記のdocを参照)。

+0

を使用できることのexception.Insteadがスローされますされますので、私のtryキャッチはOKですか?なぜなら、あなたが "try {code A} catch(Ex e){}"を使用すると、コードAが例外を起こす可能性があることを知っているからです...しかし、私のコードはスレッドをスローしません。私のコードはAbortExcetionをキャッチしようとしていますか? – pulancheck1988

+0

whileループの中に何かThreadAbortExceptionが発生した場合は、catchブロックにキャッチされます。 ThreadAbortExceptionは.NETランタイムによってスローされる特別な例外ですが、必ずしもコードである必要はありません。 – dcp

0

スレッドの実行が終了する前にコンテキストが終了しているため、ThreadAbortExceptionが発生しています。終了する前にスレッドを完了するまで待つ必要があります。終了する場合は、プログラムが終了したい信号をスレッドが受け取ることができるようにする必要があります。そして、プログラムの実行を管理するコードはスレッドの完了を待つ必要があります。

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

スレッドが終了しないことを心配している場合は、タイムアウトにoverloadを使用し、タイマーにヒットした場合は明示的にスレッドを強制終了してください。

+0

mThread!= null && mThread.IsAliveを1行でチェックします。 mThreadがnullの場合、アクセス違反が発生する可能性があります。 –

+0

nullチェックが条件文の最初の項目である限り、エラーはスローされません。これは単なる例であり、ソフトウェアのあらゆる状況に適合するものではありません。ペタンティックに焦点を絞って、より多くの質問を手近にしてください。 –

1

あなたは、コードresponse.redirect();でいくつかの場所を使用している場合、それは内部的に 実行thread.abort();ので、それはあなたがResponse.Redirect(url,false);

+0

私は 'Response.End();'を使うと 'thread abort exception'を受け取っていますが、' HttpContext.Current.ApplicationInstance.CompleteRequest(); 'を使うと例外が出るのではなく、新しい例外 'サーバはHTTPヘッダーが送信された後にヘッダーを追加できません 'というメッセージが表示されますか? – Binny

関連する問題