异步死锁问题

时间:2019-09-18 04:43:31

标签: c# asp.net-mvc asynchronous async-await deadlock

使用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())引起的死锁。

任何建议或帮助将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:2)

这种情况与Stephen Cleary在其博客https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html中提供的示例几乎完全相同。我强烈建议您阅读并理解它,因为这是一个常见问题。

现在,即使没有ConfigureAwait(false),显示的代码也不应自行死锁。我的猜测是,在链的某处,您正在阻塞异步代码,这导致了死锁。 Stephen在他的文章中概述了针对此问题的两种解决方案:

  1. 在“库”异步方法中,尽可能使用ConfigureAwait(false)。
  2. 不要阻止任务;一直使用异步。

其中任何一个都可以防止死锁,但是最好同时使用两者。