2009-08-27 35 views
4

Thread.Abort()によってスレッドが取り消されると、ThreadAbortExceptionがThread.Abortが呼び出されたときにスローされます。これにより、スレッドは直ちに作業を停止し、例外はスレッドのメインメソッドを終了するまで呼び出しスタックをバブルアップします。これにより、スレッドがアボートされます。Thread.ResetAbortのメリット

ThreadAbortExceptionに対するThreadAbortExceptionのメリットは、Thread.ResetAbort()が呼び出されたスレッドのメインメソッドで、スレッドがメインメソッドを踏み出したためにcatchブロックの後で終了するときのメリットは何ですか?

private void ThreadMainMethod() 
{ 
    try 
    { 
     while(runningAllowed = true) 
     { 
      //Do some work here 
     } 
    } 
    catch (ThreadAbortException) 
    { 
     Thread.ResetAbort(); 
    } 
} 

答えて

2

おそらく、あなたが実際に中止するかどうかを決定する素晴らしい立場にあった場合、あなたがそうする唯一の理由があります。

おそらくスレッドがそれを捕まえて、何かのステータスを確認してから、もう一度その作業に戻ります。これは基本的に '.abort()'を使ってこのスレッドの流れを制御していることを意味します。それは非常に悪い考えです。あなたは別の方法でそれと連絡をとるべきです。

一般的に、私はこれが良い考えであるケースはあまりないと思います。私が考えることができる特定のパターンや実装のアドバイスではありません。

+0

これはまさに私がそれを意味するものです。私はちょうど上記の文が全面的に使用されているコードを見ているので、いくつかの説明をしたかっただけです。 – PVitt

+0

ここでは、それが使用される良い場所です:https://stackoverflow.com/questions/299198/implement-c-sharp-generic-timeout/299273#299273 – TheSoftwareJedi

2

実際には違いはありません。メソッドが実行されるとスレッドが終了するためです。

しかし、他のケースでは、無限ループで実行されるメソッドがあるかもしれません。この場合、ThreadAbortExceptionを使用してスレッドをシャットダウンすることができます(私はあなたがすべきだと言っているわけではありませんが、そうすることができます)。例外にもかかわらず何らかの理由でスレッドが続行すると判断した場合、ThreadAbortExceptionを自動的に再実行するために、ResetAbortを呼び出す必要があります。

5

私が考えることのできるシナリオの1つは、制御された方法でスレッドを停止させたいということです。たとえば、リソースをポーリングしているワーカースレッドがあるとします。アプリケーションのメインスレッドがワーカースレッド上でAbortを呼び出すと、ThreadAbortExceptionがスローされます。私はResetAbort()を呼び出すと、偉大であるとことが判明

public void ThreadStarter() 
{ 
    try 
    { 
     RunWorkerLoop(); 
    } 
    catch (ThreadAbortException) 
    { 
     Thread.ResetAbort(); 
    } 

    // clean up and end gracefully 

} 
1

:あなたは、その後、ワーカースレッドの開始方法でその例外をキャッチResetAbortを呼び出し、そのリソースを解放する方法を終え、開いているファイル/接続を閉じるというようにすることができますWaitForタイムアウト付きthis elegant implementationのヘルプパターン。

関連する問題