.net - 如果没有创建新线程,使 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 已被弃用,仅存在于遗留支持(例如,如果XMLHttpRequest.open
代码通过参数)false
。async
如果 Blazor 允许任何阻塞调用,我会感到惊讶,因为它是一项更新的技术。但是,如果您确实编写了阻塞调用,那么浏览器窗口将在调用期间被冻结。冻结窗口的时间过长(例如,当您无法预测需要多长时间时进行网络调用)将导致浏览器/操作系统介入并显示“选项卡冻结”/“应用程序无响应”消息并提供用户可以选择杀死您的应用程序。
推荐阅读
- azure-active-directory - Microsoft Graph API - 在 Azure AD B2C 中使用本地帐户身份创建用户会出现 Request_ResourceNotFound 错误
- android - 记录来自 android 设备的传出 IP 地址
- reactjs - 回到历史反应路由器(redux)
- excel - 如果条件不满足,有没有办法取消 Userform_Terminate?
- powershell - WebJobs 与逻辑应用程序的集成
- firebase - Firebase 数据库规则,仅允许检索在其中一个子项中具有值的某些子项
- konvajs - Konva 如何显示数组中的图像
- java - 从多个表开发树层次结构
- java - API xml响应循环并提取所有元素值 - Groovy
- django - Django EmailMessage 类执行使网站缓慢而缓慢