2011-07-28 15 views
2

スレッドプールがあり、特定の条件が満たされて例外をスローするライブラリを使用しています。私の質問は、これがIDEを使い果たした場合、スレッドが停止するか、全体全体のプログラムが停止するかどうかです。例外スレッドプールでスローされる

答えて

3

アプリケーションが.Net 2+の場合、非メインスレッドで処理されない例外がプロセスを平坦化します。

app.config LegacyUnhandledExceptionPolicy設定を使用してこの動作を設定できますが、深刻なバグを隠す可能性があるため、この設定はお勧めしません。

更新

あなたは時折タイムアウト例外を無視したい場合は、トライ\ catchブロックであなたのWebサービスの呼び出しを配置することを検討し、タイムアウト例外無視:デバッガが壊れるとき

try 
{ 
    //Call WebService 
} 
catch(System.Net.WebException ex) 
{ 
    //Ignore 
} 
+0

でこれをテストしましたか? –

+0

@Joeスレッドを殺す理由を説明してください。どのような問題を解決しようとしていますか? –

+0

+1 LegacyUnhandledExceptionPolicyは、OPが望むものとまったく同じように見えます。 – Andomar

1

をすべてのスレッドが停止します。

Debug -> Windows -> Threads画面には、スレッドが表示されます。スレッドを「フリーズ」することができます。つまり、プログラムの実行を続けると停止したままになります。

したがって、デバッガが実行されていても、一部のスレッドを停止させることができます。デバッガがブレークモードになっているときにスレッドを実行することはできません。

+0

だから、現実世界に出たときにどうなるでしょうか? –

+0

@Joe Tyman:ああ、「IDEの外」とは「IDEの外」を意味します:)現実世界ではプログラムがクラッシュし、Windowsはダイアログをユーザに提示します。これを防ぐには、3つの方法があります。1)すべてのスレッドで 'try ... catch'ブロックを実行します。 2)LegacyUnhandledExceptionPolicy設定。 3)Windowsサービスとして実行する場合、スレッド内の例外はプログラムを強制終了しません – Andomar

3

だから、あなたが持っているもの確認できます:

  • あなたはTheadPoolスレッド上で実行する方法があります。
  • このメソッドは例外をスローします。
  • 例外はtry-catchブロックで処理されません。
  • アプリケーションがIDEの外で実行されています。

これで、次のコードで簡単にテストできます。あなたの質問の文脈の中で興味深いので、下の観察、特に大胆な観察に注意深く注意してください。

public static void Main() 
{ 
    ThreadPool.QueueUserWorkItem(
     (state) => 
     { 
      throw new InvalidOperationException(); 
     }, null); 

    while (true) 
    { 
     Thread.Sleep(1000); 
     Console.WriteLine(DateTime.Now.ToString()); 
    } 
} 

IDEの外部で実行している場合は、次のことに注意してください。

  • 「[アプリケーション]に問題が発生したため終了する必要があります。ご迷惑をおかけして申し訳ありません。
  • アプリケーションは実行し続け、毎秒現在の時刻を印刷します。
  • の後にアプリケーションが終了します。ダイアログボックスを閉じます。

IDE内部で実行している場合あなたは次のことに気づくでしょう。

  • IDEは例外をインターセプトし、独自の未処理の例外ウィンドウを使用して表示します。
  • すべてのスレッドが停止するため、現在の時刻が表示されません。
  • 例外を無視してデバッグセッションを再開すると、現在の時刻が表示されます。
  • IDEは再び例外を再発行し、それを傍受します。
  • すべてのスレッドが停止し、サイクルが無限に繰り返されます。

は、私はちょうどスレッドを殺すためにどのようにVisual Studioの2010

関連する問題