.NET 4.6.1中按钮点击调用CheckTokenAsync异步方法卡顿
问题排查与修复方案
一、卡顿核心原因:HttpClient实例重复创建
你在CheckTokenAsync方法中每次调用都新建HttpClient实例,这会导致HTTP连接池耗尽,进而引发请求等待卡顿。.NET中HttpClient是设计为可复用的单例/静态实例,重复创建会造成不必要的资源开销和连接阻塞。
修复后的代码:
// 静态HttpClient实例,全局复用 private static readonly HttpClient _httpClient = new HttpClient(); public async Task<CheckAccessTokenModel> CheckTokenAsync() { var request = new HttpRequestMessage(HttpMethod.Post, "https://keybfa.dev.aad.xxx.intranet/token"); request.Headers.Add("Authorization", "Basic dG9iZxxxxS1hZGFwdGVyOjE5NGU5Z2NzaGJGxxxxxxxxUelJ2"); var dic = new Dictionary<string, string> { {"grant_type", "password"}, {"username", "user"}, {"password", "pass"} }; var content = new FormUrlEncodedContent(dic); request.Content = content; var response = await _httpClient.SendAsync(request).ConfigureAwait(false); response.EnsureSuccessStatusCode(); var checkTokenResponseData = await response.Content.ReadAsStringAsync().ConfigureAwait(false); return JsonConvert.DeserializeObject<CheckAccessTokenModel>(checkTokenResponseData); }
二、按钮点击调用方式的合理性验证
你当前的按钮事件处理写法是可行的,但需要注意两个细节:
- async void的异常处理:
async void方法的异常无法通过常规Task捕获,建议在事件内部添加try/catch块,避免未处理异常导致程序崩溃:
private async void button1_Click(object sender, EventArgs e) { try { var items = await CheckTokenAsync(); // 在此处理返回的CheckAccessTokenModel,比如更新UI // 注:await后会自动回到UI线程,可直接操作控件 } catch (Exception ex) { // 处理异常,比如弹窗提示 MessageBox.Show($"请求失败:{ex.Message}"); } }
- ConfigureAwait(false)的使用:在
CheckTokenAsync中使用ConfigureAwait(false)是合理的,它能避免不必要的上下文切换,提升异步操作效率。方法内部的该配置不影响后续UI操作,因为事件处理中的await会自动切换回UI上下文。
三、其他可能导致卡顿的排查点
- 直接用Postman等工具调用目标接口
https://keybfa.dev.aad.xxx.intranet/token,确认是否是接口本身响应缓慢导致卡顿。 - 检查项目所在机器的网络环境,确认是否存在代理、防火墙等导致的网络延迟。
内容的提问来源于stack exchange,提问作者Hilario
相关产品推荐
相关产品推荐

