Avalonia项目中遇到异步编程与线程同步问题

项目场景:

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程序尝试在同步代码中等待异步任务的完成,就会形成互相等待的情况,造成了死锁现象。

  • 14
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值