嵌套异步/等待未引发异常

Dan*_*Dan 3 c# exception console-application async-await

我有一个.NET Core控制台应用程序。永远不会引发嵌套异步/等待中发生的异常:

    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
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果我删除inner async并将其调用删除await Task.Delay(1),则会捕获到异常。

Kev*_*sse 5

那是一个经典的陷阱。TaskFactory期望a Func<T>并返回a Task<T>。在您的情况下,Tis Task,因此您最终得到a,Task<Task>并且需要等待内部和外部任务。使用Unwrap此:

await f.StartNew(async () =>
{
    var x = 0;
    if (x == 0)
        throw new Exception("we have a problem");

    await Task.Delay(1);
}).Unwrap();
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,Task.StartNew是已过时的函数,如今已很少使用,因为它创建的Task与async await不能很好地兼容并且不了解异步委托。您可能需要查看Stephen Cleary的文章[StartNew危险](https://blog.stephencleary.com/2013/08/startnew-is-dangerous.html)。 (2认同)