2013-05-17 7 views
5

通常、例外をスローすることは想定していませんが(プログラミングエラー)、アプリケーションをクラッシュさせたい無効なデータをユーザーに報告するなど)。タスクの予期しない例外を取得してガベージコレクションより前にアプリケーションを終了させる

Tasksを使用する場合、この動作に近づくためのベストプラクティスはありますか? TaskScheduler.UnobservedTaskExceptionのハンドラを登録しました。問題は予期しない例外を引き起こすよりも後でが発生する可能性があることです。

質問:もしあれば、私が使用するオプション

  1. 私はのtry/catchで私のTaskの行動をラップし、私は期待していない例外をキャッチしてエスカレートする必要がありますか?そしてもしそうなら、私は(つまり、私はそれがAppDomain.UnhandledExceptionイベントを発生し、終了するために取得したいのですがエスカレートして何をすべき。

  2. 私は、これはのWinFormsアプリケーションで(UIスレッド上で継続(OnlyOnFaulted)を添付してください)それは、予想される例外でない場合は、例外を再スローその

  3. 良く以上の標準的なアプローチがあります

ここで#1がどのように見えるかです:??

var t1 = Task.Factory.StartNew(() => 
    { 
     try 
     { 
      string path = null; // Programming error. Should have been a valid string. Will cause System.ArgumentNullException below 
      using (FileStream fs = File.Create(path)) 
      { 

      } 
     } 
     catch (System.IO.IOException) { throw; } // Expected possible exception 
     catch (System.UnauthorizedAccessException) { throw; } 
     catch 
     { 
      // Anything caught here is not an expected exception and should be escalated. 
      // But how? 
     } 
    }); 

はここで#2がどのように見えるかです:継続を取り付け

TaskScheduler uiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 
var t1 = Task.Factory.StartNew(() => 
    { 
     string path = null; // Programming error. Should have been a valid string. Will cause System.ArgumentNullException below 
     using (FileStream fs = File.Create(path)) 
     { 

     } 
    }); 

t1.ContinueWith(t => 
    { 
     Exception ex = t.Exception; 
     if (ex is IOException || ex is UnauthorizedAccessException) // Expected exceptions (do nothing) 
      return; 

     throw ex; // Not expected (escalate by rethrowing) 

    }, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, uiTaskScheduler); 

答えて

2

は私には良い方法のように感じています。他の理由でUIスレッドを長時間ブロックしないという前提に慣れている場合は、UIスレッド上で継続を強制することは非常に合理的な選択肢のようです。そうすれば、緊急シャットダウンの一環として、必要なUIタスクを実行することができます。

関連する問題