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)
在哪里处理异常?
代码有两处错误。
首先,它使用了一个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)
归档时间: |
|
查看次数: |
5763 次 |
最近记录: |