项目场景:
Avalonia项目中遇到使用HttpClient异步请求时,程序无法进行的问题。
问题描述
var client = new HttpClient();
string url = $"https://jygoud.com/front/api/loadunt?imei={imei}";
HttpResponseMessage response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
string responseData = await response.Content.ReadAsStringAsync();
Console.WriteLine("Response Data: " + responseData);
return responseData;
}
在Avalonia程序中,需要用到上述代码,而在执行上述代码中的异步请求GetAsync()时遇到了问题,没有报错,但输出缺少pdb文件,线程直接退出。
解决方案:
1. 将异步代码改为同步:
var response = client.GetAsync(url).Result;
2. 配置ConfigureAwait,不要恢复原来的同步上下文
var response = await client.GetAsync(url).ConfigureAwait(false);
原因分析:
当await一个尚未完成的Task时,为了能够在Task完成时恢复执行,它会去捕获当前的“同步上下文”。而对GUI等界面程序来说,“同步上下文”在同一时间仅允许一个操作。如果GUI程序尝试在同步代码中等待异步任务的完成,就会形成互相等待的情况,造成了死锁现象。