首页 > 解决方案 > 如果没有创建新线程,使 api 方法异步有什么好处?

问题描述

我正在关注本教程: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();
    }
}

标签: .netasp.net-coreasynchronous

解决方案


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

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

这对于良好的用户体验非常重要,以至于许多客户端技术根本不再允许阻塞调用,并且少数允许阻塞调用的 API 已被弃用,仅存在于遗留支持(例如,如果XMLHttpRequest.open代码通过参数)falseasync

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


推荐阅读