0

例外処理非待望のは、私がメインメソッドを使用してコンソールアプリケーション、このような何か持っていると仮定しましょうタスク

public static void Main(string[] args) 
{ 
    AppDomain.CurrentDomain.UnhandledException += (sender, eventArgs) => 
    { 
     Console.WriteLine("App Unobserved"); 
    }; 
    TaskScheduler.UnobservedTaskException += (sender, eventArgs) => 
    { 
     Console.WriteLine("Task Unobserved"); 
    }; 
    Task.Run(async() => await MyAwesomeMethod()); 
    // other awesome code... 
    Console.ReadLine(); 
} 

public static async Task MyAwesomeMethod() 
{ 
    // some useful work 
    if (something_went_wrong) 
     throw new Exception(); 
    // other some useful work 
} 

だから、私はちょうどMyAwesomeMethod(ファイア・アンド・フォーゲット)を実行して、やってみたいです他の仕事もありますが、未処理の例外があるかどうかも知りたいと思っています。しかし、アプリケーションは問題の兆候なしに正常に終了します(例外はちょうど飲み込まれます)。

私はMyAwesomeMethod()から例外を処理するには、待つことも、Task.Run(...)を使用することもできます。

+2

'しかし、私はまた、未処理のexceptions.'そこかどうかを知りたい - 、それそれは本当に火事ではないと忘れているのですか? –

+0

スレッドプールスレッドで別の非同期操作を開始する理由はありません。 'MyAswesomeMethod'を起動したい場合は、' MyAwesomeMethod'を呼び出します。 *既に*非同期です。それを非同期ラムダにラップし、スレッドプールスレッドでそれを開始することは、システムリソースを無駄にするだけです。 – Servy

+0

@Servy実際には、理由はあります。私はすべてがOKならMyAwesomeMethodについて何も知りたくありませんが、その中の未処理の例外についてすべてを知りたいと思っています。 – Andrew

答えて

1

私はMyAwesomeMethod(fire-and-forget)を実行します...しかし、未処理の例外があるかどうかも知りたいと思っています。しかし、アプリケーションは問題の兆候なしに正常に終了します(例外はちょうど飲み込まれます)。

「火と忘れ」ではありません。 "Fire and forget"とは文字通り、あなたがのときにタスクが完了したかどうか、または完了したかどうかを気にしないことを意味します。

私はMyAwesomeMethod()から例外を処理するには、待つか、Task.Run(...)を使わずにどうすればいいですか?とにかく

使用await

Task.Run(async() => { 
    try { 
    await MyAwesomeMethod(); 
    } catch (Exception ex) { 
    Console.WriteLine(ex); 
    } 
}); 
0

たとえば、try ... catchブロックのバックグラウンドタスクにコードをラップし、catchブロックを入力するとすぐにイベントを発生させることができます。

event EventHandler<Exception> exceptionInWorker; 

Likeしてタスクで

try 
{ 
    //do something 
} 
catch (Exception e) 
{ 
    exceptionInWorker?.Invoke(this, e); 
} 
0

を行うこの操作が完了したら、あなたのタスクのstatusを確認することができます。

Task.Run(() => MyAwesomeMethod()).ContinueWith((task) => 
{ 
    if (task.Status == TaskStatus.RanToCompletion && task.Result != null) 
    { 

    } 
    else 
    { 
     try 
     { 
      Logger.LogError(task.Exception.ToString()); 
      Logger.LogMessage("something_went_wrong"); 
     } 
     catch { } 
    } 
}); 
+0

いいえ、良い試み:)他の解決策が見つからない場合、私はそれを使用します。 – Andrew

+0

ステータスを再生し、あなたの 'AwesomeMethod'関数で何かを返す! – billybob

-2

あなたはしかし、あなたはその例外プロパティを介して、未処理の例外にアクセスし、それに関するすべての情報をログに記録でき、それによって、その2番目のパラメータとしてUnobservedTaskExceptionEventArgsを取るハンドラと同じようにあなたはTaskScheduler.UnobservedTaskExceptionイベントをサブスクライブすることができます。

+0

それは彼がちょうど彼の質問に書いたものです... – billybob

+0

まあ、彼はそれを購読しますが、例外は何もしません。ハンドラは2番目のパラメータとしてUnobservedTaskExceptionEventArgsを取得し、例外を介してExceptionプロパティを使用して未処理の例外にアクセスできます。それについてのすべての情報を記録する。 –

関連する問題