2009-07-15 18 views
9

後にスレッドを停止する、私はこのコードを持っている:C#の:例外

Thread t = new Thread(() => UpdateImage(origin)); 
t.Name = "UpdateImageThread"; 
t.Start(); 

メソッドUpdateImage(原点)が例外をスローした場合、スレッドを停止させる必要があるか、それは例外の後に立ち止まったでしょうか?

ありがとうございました!

答えて

16

UpdateImageが例外をスローすると、おそらくプロセス全体が停止する可能性があります。トップレベル例外を発生させるスレッドは、大きな問題を示します。たとえば、try/catchUpdateImageに置き、適切な処理を行うなど、これをラップする必要があります。例外は、スレッドの一番上に取得する場合、はい、スレッドが死んでいる:

Thread t = new Thread(() => { 
    try {UpdateImage(origin); } 
    catch (Exception ex) {Trace.WriteLine(ex);} 
}); 
t.Name = "UpdateImageThread"; 
t.Start(); 

(またはエラー処理の選択)例外はそれがある場合、スレッドが停止することはありません

1

スレッドは、あなたが例外を処理していないときに、残りのプロセスと共に、自動的に終了します.Net 2.0以上であることを前提としています(問題のC#3構文によるものと思われます) 。

3

UpdateImageメソッドのどこかにキャッチされます。ただし、catch句がメソッドから明示的に返されない限りそれがunhandeledされている場合は

、あなたのアプリケーションは、とにかくクラッシュします - ので、スレッドを停止させる;)

それはあなたのUpdateImage方法で試して... catchブロックを配置し、そこに取り扱うお使いの論理エラーを実行するのが最善ですそれはどこに属しています。あなたは自分自身のために天気を戻してスレッドを終了するか再試行するかを決めることができます

1

メインスレッドのようなものです。例えば、メインスレッドに例外が発生し、アプリケーションとアプリケーションを終了します。ユーザスレッドバックグラウンドスレッドが例外をスローし、.NET 2.0以降

10

、用

同じことが(それが処理されない)、.NETランタイムは、あなたのプロセスをテイクダウンします。 Windows.Formsアプリケーションでは、これは異なります。 Application.ThreadExceptionイベントを使用して例外をキャッチすることができます。

これは.NET 1.0/1.1とは異なり、ここでトピック全体について読むことができます(例:.NET 2.0以降のレガシー動作を有効にする方法):http://msdn.microsoft.com/en-us/library/ms228965.aspx#ChangeFromPreviousVersions

Windows.Formsを使用する場合でも、以前の動作を使用する場合でも、プロセスが終了しない場合でも明示的にスレッドを停止する必要はありません。例外がそれを停止します。