我正在学习本教程: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单线程是如何工作的。