c# - 嵌套的异步/等待未引发异常
问题描述
我有一个 .NET Core 控制台应用程序。永远不会抛出嵌套 async/await 中发生的异常:
static async Task Main(string[] args)
{
try
{
var f = new TaskFactory(TaskScheduler.Current);
await f.StartNew(async () =>
{
var x = 0;
if (x == 0)
throw new Exception("we have a problem");
await Task.Delay(1);
});
}
catch(Exception)
{
// never reaches here
}
}
如果我删除了 inner async
,并放弃了对 的调用await Task.Delay(1)
,就会捕获到异常。
解决方案
这是一个经典的陷阱。TaskFactory
期望 aFunc<T>
并返回 a Task<T>
。在您的情况下,T
is Task
,因此您最终得到 aTask<Task>
并且您需要等待内部和外部任务。用于Unwrap
此:
await f.StartNew(async () =>
{
var x = 0;
if (x == 0)
throw new Exception("we have a problem");
await Task.Delay(1);
}).Unwrap();
推荐阅读
- linux - Amazon-ssm-agent 无法识别的服务(刚刚通过 Docker 安装)
- graphql - 我应该尽量减少中继应用程序中的订阅数量吗?
- jquery - 过滤时如何在页面上保留一些元素?
- c++ - 为什么函数参数总是左值?
- c# - 使用箭头键禁用按钮之间的跳转
- javascript - ReactJS:调用render()中的函数时组件的内容不更新
- ruby - UTF-8 编码不适用于 Ruby 中的获取方法
- python - Python Webscrape:隐藏页面源中不可用的奇怪 url 链接
- apache-spark - 如何在apache spark中使用sql提取工作日的特定时间间隔?
- sass - 有没有办法在 SASS/SCSS 的 @function 中使用 @mixin?