首页 > 解决方案 > 嵌套的异步/等待未引发异常

问题描述

我有一个 .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),就会捕获到异常。

标签: c#exceptionasync-awaitconsole-application

解决方案


这是一个经典的陷阱。TaskFactory期望 aFunc<T>并返回 a Task<T>。在您的情况下,Tis 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();

推荐阅读