HttpWebResponse.GetResponseAsync тупик - PullRequest
0 голосов
/ 30 января 2019

У меня есть простой контроллер Asp.Net MVC (.NET 4.7.2) и простой метод, который выдает несколько асинхронных http-запросов.

using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Web.Mvc;

namespace WebApplication1.Controllers
{
  public class HomeController : Controller
  {
    public async Task<string> Index()
    {
      var tasks = Enumerable.Range(0, N).Select(MakeHttpCall);
      await Task.WhenAll(tasks);
      return "done";
    }

    private static async Task MakeHttpCall(int i)
    {
      Console.WriteLine("Start "+i);
      await GetUrlAsync(URL);
      Console.WriteLine("Finish "+i);
    }

    public static async Task GetUrlAsync(string url)
    {
      var request = WebRequest.Create(url);
      request.Method = "GET";

      using (var response = (HttpWebResponse) await request.GetResponseAsync())
      using (var streamReader = new StreamReader(response.GetResponseStream()))
      {
        streamReader.ReadToEnd();
      }
    }
  }
}

Если N = 20, все работает как положено.Но если N = 100 (в моем случае), это приведет к тупику, и действие Index будет зависать.

Почему это происходит?

Ps Эта проблема не воспроизводитсяв консольном приложении.Таким образом, это, вероятно, относится к контексту синхронизации asp.net, как описано в этой статье.

https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

await request.GetResponseAsync().ConfigureAwait(false) решает проблему, но не отвечает на главный вопрос.Это потому, что метод GetResponseAsync () не является «действительно асинхронным»?Возможно, кто-то может это прояснить ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...