Różna obsługa wyjątków między Task.Run a Task.Factory.StartNew
Wystąpił problem podczas używaniaTask.Factory.StartNew
i próbował uchwycićexception
to jest rzucone. W mojej aplikacji mam długotrwałe zadanie, które chcę umieścić w aTask.Factory.StartNew(.., TaskCreationOptions.LongRunning);
Jednak wyjątek nie zostaje złapany, gdy używamTask.Factory.StartNew
. Działa jednak tak, jak się tego spodziewam, gdy używamTask.Run
, o którym myślałem, że jest tylko opakowaniemTask.Factory.StartNew
(na przykładten artykuł MSDN).
Przykład pracy znajduje się tutaj, z tą różnicą, że wyjątek jest zapisywany na konsoli podczas używaniaTask.Run
, ale nie podczas używaniaFactory.StartNew
.
Moje pytanie brzmi:
jeśli mamLongRunning
zadanie, które ma możliwość wyrzucania wyjątków, jak mam je obsługiwać w kodzie wywołującym?
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");
});
}