使用await client.GetAsync(url)
和await SendParkInfoRequest(parkRegionId)
时,我的代码陷入僵局。如果我使用ConfigureAwait(false)
,效果很好。
下面是我的代码。
public virtual async Task<ParkingInfo> SendParkInfoRequest(string id)
{
using (var client = Helper.GetHttpClient())
{
//
var url = RequestUri + id;
var data = await client.GetAsync(url).ConfigureAwait(false);
string result = await data.Content.ReadAsStringAsync();
//
}
}
}
public async Task<AvailableSpotsResponse> GetAvailableSpots(string parkRegionId)
{
//
var data = await SendParkInfoRequest(parkRegionId).ConfigureAwait(false);
//
}
我的代码中有什么地方做错了吗? Helper.GetHttpClient()
正在设置HttpClient
。是由此行using (var client = Helper.GetHttpClient())
引起的死锁。
任何建议或帮助将不胜感激。
谢谢。
答案 0 :(得分:2)
这种情况与Stephen Cleary在其博客https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html中提供的示例几乎完全相同。我强烈建议您阅读并理解它,因为这是一个常见问题。
现在,即使没有ConfigureAwait(false),显示的代码也不应自行死锁。我的猜测是,在链的某处,您正在阻塞异步代码,这导致了死锁。 Stephen在他的文章中概述了针对此问题的两种解决方案:
其中任何一个都可以防止死锁,但是最好同时使用两者。