【发布时间】:2019-08-21 06:36:01
【问题描述】:
我有一个 .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
}
}
如果我删除了内部的async,并放弃对await Task.Delay(1) 的调用,就会捕获到异常。
【问题讨论】:
-
为什么需要TaskFactory?
-
异常是在另一个线程中而不是在主线程中引发的,这就是它没有出现的原因
-
在大多数情况下,您应该使用静态方法
Task.Run而不是TaskFactory.StartNew。例如,它会在异步委托的情况下自动解包内部任务,TaskFactory.StartNew不会。 -
@IbraHimM.Nada 不应该等待在同一个 SynchronizationContext 中运行的任务从而传播异常?即便如此,为什么当 OP 删除
await Task.Delay(1);时会引发异常? -
这不是await函数的一部分吗?第一个 await 不应该得到结果,因此会遇到任何异常吗?
标签: c# exception async-await console-application