async作为方法结果管理器?

Roy*_*mir 4 c# async-await

从这里:

“async”关键字在该方法中启用"await"关键字, 更改方法结果的处理方式.这就是async关键字的全部功能!

第二部分让我感兴趣,但我没有在文章中找到解释.

做一点测试(注意 - 没有等待的任务在这里):

  static void X()
    {
        try
        {
            Y();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

    static async void Y() //<---- notice here
    {
        throw new NotImplementedException();
    }


    static void Main(string[] args)
    {
        X();

        Console.ReadLine();
    }
Run Code Online (Sandbox Code Playgroud)

这将终止该程序:

在此输入图像描述

虽然移除 async从这个:

 static async void Y()  
    {
        throw new NotImplementedException();
    }
Run Code Online (Sandbox Code Playgroud)

将产量:

在此输入图像描述

MSDN对此一无所知:

如果async关键字修改的方法不包含await表达式或语句,则该方法将同步执行.编译器警告会提醒您任何不包含await的异步方法,因为这种情况可能表示错误

那么,是什么别的这个词async确实是我的代码可以产生不同的结果?

Ser*_*rvy 7

async方法捕获所有异常,不要将它们抛出到方法的调用者,而是将它们包含在Task方法返回的内容中,将其标记为出错Task.如果方法是async void,则在应用程序级别抛出错误,如您所见,因为无法通过a观察异常Task.