У меня возникла проблема, когда я использовал 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");
});
}