如果没有创建新的线程,那么使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();
}
}

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

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

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

如果Blazor允许任何阻塞呼叫,我会感到惊讶,因为这是一项较新的技术。但是,如果您确实编写了阻止调用,那么在调用过程中浏览器窗口将被冻结。冻结窗口过长的时间(例如,当你无法预测需要多长时间时进行网络呼叫(将导致浏览器/OS使用";选项卡冻结"/"应用程序无响应";消息,并为用户提供终止应用程序的选项。

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

这些函数正在进行http调用,这些调用本身就是异步的。由于这些调用被启动,但逻辑的处理被挂起,直到http调用通过使用await返回。

这些函数将返回挂起的promise(返回答案的"promise"(,因此您将await它们,或者设置代码以在promise完成时执行。

如果你需要更多的细节,我建议你查阅大量教程中的任何一个,这些教程将涵盖回调的历史记录->承诺->async/await,并通过阅读JS事件循环来了解JavaScript单线程是如何工作的。

最新更新