首页 > 解决方案 > 使用 AsyncContext 遇到死锁代码

问题描述

这是我的代码,我在我的库中使用AsyncEx试图绕过潜在的死锁,但我最终还是在那里:

return AsyncContext.Run(async () =>
{
   var get = await httpClient.GetAsync(url);
   if (get.IsSuccessStatusCode && (get.StatusCode == HttpStatusCode.OK))
   {
      var content = await get.Content.ReadAsStringAsync();
      return content;
   }

   return "";
});

我从命令行应用程序运行它,url连续使用多个不同的值调用它,但在一个大for循环中同步。如果有足够多的调用,它最终会死在它的轨道上。难道我做错了什么?

标签: c#nito.asyncex

解决方案


我认为发生的是,在调用 GetAsync 后,延续无法切换回同一个线程,因为另一个线程正在等待延续开始。以下代码有效吗?

return AsyncContext.Run(async () =>
{
   var get = await httpClient.GetAsync(url).ConfigureAwait(false);
   if (get.IsSuccessStatusCode && (get.StatusCode == HttpStatusCode.OK))
   {
      var content = await get.Content.ReadAsStringAsync().ConfigureAwait(false);
      return content;
   }

   return "";
});

推荐阅读