示例代码是这样的:
Action action = async () =>
{
Console.WriteLine("Action start...");
await Task.Delay(1000);
throw new Exception("Exception from an async action");
};
Task.Run(action);
Console.ReadKey();
在哪里处理异常?
最佳答案
代码有两处错误。
首先,它使用 async void
委托(delegate),防止异常正常工作(有关避免 async void
的更多信息,请参阅 my MSDN article on async best practices )。它应该使用 Func<Task>
而不是 Action
(有关异步友好委托(delegate)类型的更多信息,请参阅 my blog post on synchronous and asynchronous delegate types ):
Func<Task> action = async () =>
{
Console.WriteLine("Action start...");
await Task.Delay(1000);
throw new Exception("Exception from an async action");
};
第二个错误是它在线程池上运行委托(delegate)时使用了即发即弃。 “即发即弃”的“忘记”部分意味着“忽略所有异常”。为了正确传播异常,任务从 Task.Run
返回应该等待(有关 await
如何处理任务的更多信息,请参阅我的 blog post on async and await ):
await Task.Run(action);
关于c# - 在异步操作的任务中在哪里处理异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38495873/