【问题标题】:What advantage does making api methods async gives if no new threads are being created?如果没有创建新线程,使 api 方法异步有什么好处?
【发布时间】:2021-04-11 11:45:26
【问题描述】:

我正在关注本教程:https://codewithmukesh.com/blog/authentication-in-blazor-webassembly/ 里面的所有方法都是异步的。重点是什么?异步不会导致创建任何新线程,所以它都是单线程异步的。那么它真的有什么帮助呢?如果是同步的,行为会发生什么变化?

例子:

public class AuthService : IAuthService
{
    private readonly HttpClient _httpClient;
    public AuthService(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }
    public async Task<CurrentUser> CurrentUserInfo()
    {
        var result = await _httpClient.GetFromJsonAsync<CurrentUser>("api/auth/currentuserinfo");
        return result;
    }
    public async Task Login(LoginRequest loginRequest)
    {
        var result = await _httpClient.PostAsJsonAsync("api/auth/login", loginRequest);
        if (result.StatusCode == System.Net.HttpStatusCode.BadRequest) throw new Exception(await result.Content.ReadAsStringAsync());
        result.EnsureSuccessStatusCode();
    }
    public async Task Logout()
    {
        var result = await _httpClient.PostAsync("api/auth/logout", null);
        result.EnsureSuccessStatusCode();
    }
    public async Task Register(RegisterRequest registerRequest)
    {
        var result = await _httpClient.PostAsJsonAsync("api/auth/register", registerRequest);
        if (result.StatusCode == System.Net.HttpStatusCode.BadRequest) throw new Exception(await result.Content.ReadAsStringAsync());
        result.EnsureSuccessStatusCode();
    }
}

【问题讨论】:

  • 看看asynchronous programming是什么。 “异步”和“并发/并行”不是一回事。
  • @Xerillio 我知道,这就是我要问的原因。如果会有并发,那么我明白为什么它会更快。
  • 正如@Mike 在他的回答中指出的那样,有很多关于这个主题的教程等 - 即使是关于 SO。你看过一些吗?您难以掌握哪些部位?简而言之,使用await 可以释放当前线程来做一些其他工作,同时等待异步工作完成。
  • @Xerillio 好的,但是它如何决定接下来要做什么,执行哪部分代码?

标签: .net asp.net-core asynchronous


【解决方案1】:

有什么意义?异步不会导致创建任何新线程,所以它都是单线程异步的。那么它真的有什么帮助呢?如果是同步的,行为会发生什么变化?

在客户端应用程序中使用async/await 的目的是保持 UI 线程空闲。 UI 线程必须是空闲的,才能保持对用户交互的响应。

这对于良好的用户体验非常重要,以至于许多客户端技术根本不再允许阻塞调用,并且少数允许阻塞调用的 API 已被弃用,仅存在于旧版支持中(例如,@987654323 @如果代码为async参数传递false)。

如果 Blazor 允许任何阻塞调用,我会感到惊讶,因为它是一项更新的技术。但是,如果您确实编写了阻塞调用,那么浏览器窗口将在调用期间被冻结。冻结窗口时间过长(例如,当您无法预测需要多长时间时进行网络调用)将导致浏览器/操作系统介入并显示“选项卡冻结”/“应用程序无响应”消息并提供用户可以选择终止您的应用。

【讨论】:

    【解决方案2】:

    任何使用await 的函数本身必须是async

    这些函数进行的 http 调用本身是异步的。由于这些调用已启动,但逻辑处理会暂停,直到 http 调用通过使用 await 返回。

    这些函数将返回待处理的 Promise(一个“承诺”以回复您的答案),因此您可以 await 它们或设置代码以在 Promise 完成时执行。

    如果您需要更多详细信息,我建议您查看众多教程中的任何一个,这些教程将涵盖回调的历史 -> 承诺 -> 异步/等待,并通过阅读了解 JavaScript 单线程的工作原理在 JS 事件循环上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 2015-01-10
      • 2017-05-28
      相关资源
      最近更新 更多