使用中に問題が発生し、スローされTask.Factory.StartNew
た をキャプチャしようとしました。exception
私のアプリケーションには、長時間実行されるタスクがあり、それをカプセル化したいと考えています。Task.Factory.StartNew(.., TaskCreationOptions.LongRunning);
ただし、を使用している場合、例外はキャッチされませんTask.Factory.StartNew
。ただし、 を使用すると期待どおりに機能しますがTask.Run
、これは単なるラッパーだと思っていましたTask.Factory.StartNew
(たとえば、この MSDN の記事によると)。
実際の例をここに示します。違いは、 を使用する場合は例外がコンソールに書き込まれますが、 を使用する場合は書き込まれTask.Run
ませんFactory.StartNew
。
私の質問は次
のとおりです。例外をスローする可能性
のあるタスクがある場合LongRunning
、呼び出し元のコードでそれらをどのように処理すればよいですか?
private static void Main(string[] args)
{
Task<bool> t = RunLongTask();
t.Wait();
Console.WriteLine(t.Result);
Console.ReadKey();
}
private async static Task<bool> RunLongTask()
{
try
{
await RunTaskAsync();
}
catch (Exception e)
{
Console.WriteLine(e);
return false;
}
Console.WriteLine("success");
return true;
}
private static Task RunTaskAsync()
{
//return Task.Run(async () =>
// {
// throw new Exception("my exception");
// });
return Task.Factory.StartNew(
async () =>
{
throw new Exception("my exception");
});
}