异步操作任务中的异常在哪里处理?

Wan*_*ang 3 c# action task async-await

示例代码是这样的:

Action action = async () =>
{
    Console.WriteLine("Action start...");
    await Task.Delay(1000);
    throw new Exception("Exception from an async action");
};

Task.Run(action);

Console.ReadKey(); 
Run Code Online (Sandbox Code Playgroud)

在哪里处理异常?

Ste*_*ary 5

代码有两处错误。

首先,它使用了一个async void委托,它可以防止异常正常工作(有关避免的更多信息async void,请参阅我关于异步最佳实践的 MSDN 文章)。它应该使用Func<Task>而不是Action(有关异步友好委托类型的更多信息,请参阅我关于同步和异步委托类型的博客文章):

Func<Task> action = async () =>
{
  Console.WriteLine("Action start...");
  await Task.Delay(1000);
  throw new Exception("Exception from an async action");
};
Run Code Online (Sandbox Code Playgroud)

第二个错误是它在线程池上运行委托时使用了即发即忘。“fire-and-forget”的“forget”部分的意思是“忽略所有例外”。为了正确传播异常,Task.Run应该等待从返回的任务(有关如何await处理任务的更多信息,请参阅我关于 async 和 await 的博客文章):

await Task.Run(action);
Run Code Online (Sandbox Code Playgroud)