【问题标题】:Using await keyword [duplicate]使用 await 关键字 [重复]
【发布时间】:2015-11-26 00:32:30
【问题描述】:

我创建了一个新的 ASP.Net 5 应用程序,在生成的代码中有很多 await 关键字的使用,例如:

var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
    await _signInManager.SignInAsync(user, isPersistent: false);
    return RedirectToAction(nameof(HomeController.Index), "Home");
}

我的问题是我们能通过这个实现什么?我们仍然需要等待获取结果,直到我们没有得到结果才能继续进行。那么await在这里有什么意义呢?

【问题讨论】:

  • 您可能会问,await随时使用相同的推理有什么意义。这段代码在任何方面都没有什么特别之处。
  • 可能最重要的事情是您可以从事其他工作。而且,在 ASP 的上下文中,如果您没有其他事情可做,正在执行的线程可以退回到线程池并为其他请求提供服务,直到您的结果准备好。

标签: c# asp.net .net asp.net-mvc


【解决方案1】:

优点是控件返回给当前方法的调用者。当等待的任务完成时,您的异步方法将“恢复”。

这非常有用,因为它消除了管理线程和/或回调的需要。

编辑:

这就是您希望(或不希望)使用 async/await 的原因。假设您有这样的网络调用:

public RequestResult Request(string queryString)
{
    var response = connection.Request(queryString);
}

这是一个阻塞调用,它将停止当前正在执行的线程并等待调用完成。可能有Request(string) 方法的Async 版本,通常以Async 为后缀。如果是这样,您可以在 async Task 方法中 await 它。

public RequestResult Request(string queryString)
{
    var response = connection.Request(queryString);
}

控制将被释放,直到任务完成,允许调用者继续。这对于 GUI 应用程序非常有用。您可以将async 方法绑定到事件,触发它,启动请求并在请求完成时保持 UI 更新。

async/await 之前,首选方法是使用Begin/End 方法。您可以将委托传递给 Begin 方法,并在任务完成时调用它。我要指出,这个还是可以用的! Here 是有关异步模式的更多详细信息。 async/await 被称为 TAP,基于任务的异步编程。

编辑:C# 编译器将在 await 关键字之后采用该方法的其余部分,并使其类似于回调(内部)。

【讨论】:

  • 好吧,没有 await 也不会有任何线程管理或回调。代码会更简单。
  • 是的,如果你只是调用MyTask().Wait(),实际上使用 async/await 是没有意义的,但是没有任何其他上下文,我们无法判断是否需要使用 async/等待
  • 我会补充一些细节,希望能帮助你掌握async/await的用法。
  • 感谢您的解释。我了解它的工作原理以及为什么它在长 IO 操作中很有用,但是长 CPU 绑定操作呢?如果我理解正确,它们仍然需要一个新线程并且不应该为它们使用 async/await,对吧?
  • task api 会根据需要创建一个task。它有一定数量的已经创建的线程,节省了该线程的创建时间,有时很重要。而且您仍然可以获得 async/await 的代码效率
【解决方案2】:

大概,这一切都发生在一个带有async 关键字的函数中。考虑那个函数的调用者——他们await正在做某事(这个函数!),他们很可能同时能够继续做其他事情.

在 ASP.NET 的上下文中,应用程序在堆栈中通过某些方式捕获传入请求并调用控制器上的方法来计算要发送的响应内容。如果您的控制器操作是async,您的应用程序可以执行多任务(双关语...)并更快地处理更多请求,而无需等待例如数据库或 I/O。

【讨论】:

    猜你喜欢
    • 2021-09-17
    • 2020-04-20
    • 2013-05-26
    • 2023-03-24
    • 1970-01-01
    • 2015-06-08
    • 2018-06-18
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多