【问题标题】:need to wait() on async call, but good practice says to not block async需要在异步调用时等待(),但好的做法是不要阻止异步
【发布时间】:2020-11-11 21:38:20
【问题描述】:

我刚开始使用asyncawait 并试图巩固我的理解。我想保证异步函数完成。

据我了解,await 实际上并不能保证异步函数会运行(但会保存状态并跟踪异步函数的调用者停止的位置)。

所以为了保证异步任务完成,我尝试了Task.Delay(1000),但不认为这是值得生产的代码。我使用的是.Wait(),另一个stackoverflow帖子说这是不好的做法,因为它将同步调用与异步调用混合在一起(.Wait(), .Result()都是同步块)。

在不使用.wait().result() 的情况下如何保证异步调用的完成?

【问题讨论】:

  • 不是一个完整的答案,但.Wait.Result 是等待完成的方法。他们可能不是最好的,但他们工作。另一篇文章可能意味着您通常应该编写代码以允许异步调用,但 IME 有时您只需要进行同步调用,这就是存在这些方法的原因。

标签: .net asynchronous


【解决方案1】:

在不使用 .wait() 或 .result() 的情况下如何保证异步调用的完成?

Wait/Result 将同步阻塞,直到异步调用完成。

await 将异步等待该异步调用完成。

它们都提供相同级别的“保证”。

【讨论】:

    【解决方案2】:

    等待异步方法:

    public async void Main()
    {
      var result = await AsyncMethodAsync();
    }
    

    保证结果变量将在异步方法结束时从AsyncMethodAsync() 填充,否则如果在 AsyncMethodAsync() 中发生异常,则会引发异常。 调用 .ResultWait() 不保证任何内容,并且会阻塞您的主线程

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-15
      • 2019-05-21
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 2020-01-28
      相关资源
      最近更新 更多