У меня есть простой контроллер 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 () не является «действительно асинхронным»?Возможно, кто-то может это прояснить ...