在非异步方法中调用异步方法而不使用await关键字?

8

没有使用await调用异步方法,并在非异步方法中进行调用的行为是什么?我之所以问是因为我看到Visual Studio在调用异步方法时没有显示任何警告,就好像这是一件非常正常的事情。在这种情况下,异步方法是否会像同步方法一样运行?


2个回答

6
异步方法经常以这种“发射并忘记”的方式被调用(是的,在这种情况下,有关不使用/特别小心使用async void的通常建议也完全适用)。
从一个没有async修饰符的方法中调用异步方法不会导致异步方法同步执行。
相反,异步方法将执行到第一个awaitable上的await,该awaitable的IsCompleted == false(即第一个不同步完成的Task实例)。此时,调用(外部)方法将恢复执行,并且异步方法的其余部分将在稍后安排运行。

6

一个方法有async修饰符只是该方法的实现细节。它只是意味着您可以更轻松地编写异步代码。这并不会改变方法的调用方式。

通常,异步方法返回TaskTask<T>。它也可以返回void,但通常仅用于事件处理程序,否则调用方无法确定方法何时完成。在C# 7中,它还可以返回自定义任务类型。

现在,调用方如何使用该返回值取决于他们自己。假设一个方法返回Task<int> - 同步方法可能会调用该方法,然后完全忽略返回的任务(“fire and forget”),或者使用ContinueWith附加一个延续,或将其传递给将等待它的异步方法。所有这些都不会改变异步方法本身的行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接