在非异步方法中调用异步方法而不等待?

时间:2017-08-29 15:40:33

标签: .net async-await

在没有await和非异步方法的情况下调用异步方法的行为是什么?我问,因为我看到Visual Studio在调用异步方法时没有显示任何警告,就好像这是完全正常的事情。在这种情况下,异步方法的行为是否同步?

2 个答案:

答案 0 :(得分:6)

方法具有async作为修饰符的事实是该方法的实现细节。它只是意味着您可以更轻松地编写异步代码。它根本不会改变方法的方法。

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

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

答案 1 :(得分:2)

以这种即发即忘的方式调用异步方法并不罕见(是的,关于不使用/特别注意async void的通常建议也完全适用于此情况)。

具有async修饰符的方法调用异步方法 not 会导致异步方法同步执行。

相反,async方法将在等待await的情况下执行最后一个IsCompleted == false(即等待的Task的第一个未完成同步的实例)。此时,调用(外部)方法将继续执行,异步方法的其余部分将安排在稍后运行。