首页 文章

async作为方法结果管理器?

提问于
浏览
4

From here

“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();
    }

这将终止该程序:

enter image description here

从中删除 async 时:

static async void Y()  
    {
        throw new NotImplementedException();
    }

将产量:

enter image description here

MSDN对此一无所知:

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

Question

如果是这样,那么 async 这个词还有什么呢?我的代码产生了不同的结果?

1 回答

  • 7

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

相关问题