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

标签 c# async-await task action

示例代码是这样的:

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/

相关文章:

c# - 二维游戏物理资源

c# - 使用显式 TLS/SSL 的 FtpWebRequest

javascript - 如何在 JavaScript 的异步函数中使用 do/while 语句?

task - 删除 celery/rabbitmq 中所有待处理任务

c# - 使用 XmlSerializer 反序列化 XML 时保留纯空白元素内容

node.js - 从 axios 获取对象数组并使用返回值调用另一个 axios 函数并将输出附加到第一个结果

javascript - 让 React 在长时间运行的任务之间渲染页面

c# - 使用 Interlocked.CompareExchange 递增计数器直到一个值

c# - 无需等待的任务异常处理

c# - XNA 4 和外部引用