【问题标题】:Await and Async in same line等待和异步在同一行
【发布时间】:2021-11-26 20:07:40
【问题描述】:

我了解 async 的工作原理以及它与 javascript 承诺的比较方式,但我不确定像下面这样的行会有什么好处

IdentityResult result = await UserManager.CreateAsync(user, model.password);

因为我们正在创建一个异步调用并立即在线程上等待,所以在异步调用调用完成之前不会执行后面的行。

【问题讨论】:

  • 这取决于操作的实现方式,但如果实现正确,它将在某个时间释放线程等待异步操作(例如 IO 或网络访问)完成。
  • 立即等待线程 - await 不会让 线程 等待,而是让方法的其余部分等待。这就是重点!

标签: c# async-await


【解决方案1】:

好处是,如果该操作是真正异步的,那么在某些时候调用线程将被释放以在您的应用程序中执行其他工作,而不是被同步阻塞。

这种用法带来更高的可扩展性。

您仍在等待操作完成后再继续。异步方法不会神奇地运行得更快,但它们确实可能使用更少的资源,而且您通常可以同时运行多个。

如果我们想象CreateAsync 看起来像这样:

async Task<IdentityResult> CreateAsync()
{
    // do something
    await Task.Delay(1000);
    // do something else
}

然后在await Task.Delay(1000) 释放一个线程并异步等待,而不是等待一秒钟。该线程可以在您的进程中执行其他 CPU 操作并避免上下文切换。

如果CreateAsync 被正确实现,那么会有一些实际的异步操作而不是Task.Delay

【讨论】:

    【解决方案2】:

    假设您有一个用户界面,并且每当按下按钮时都会调用您的函数 UserManager.CreateAsync。

    我不知道 CreateAsync 函数,但由于它是异步且可等待的,我猜设计师认为它需要足够长的时间才能异步执行。

    如果 CreateAsync 需要一分钟,并且无法等待,那么您的用户界面将死一分钟。

    使用这种方法,您的界面仍然可以响应。如果您在 CreateAsync 中使用 CancellationToken 作为参数,用户界面甚至可以决定取消任务,例如关闭程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 2021-09-05
      • 1970-01-01
      相关资源
      最近更新 更多