【问题标题】:Calling an async method without await in a non-async method?在非异步方法中调用异步方法而不等待?
【发布时间】:2017-08-29 15:40:33
【问题描述】:

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

【问题讨论】:

标签: .net async-await


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    相反,异步方法将在具有IsCompleted == false 的可等待对象上执行到第一个await(即第一个等待的Task 实例,它不会同步完成)。此时,调用(外部)方法将恢复执行,而异步方法的其余部分将安排在稍后运行。

    【讨论】:

      猜你喜欢
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多