#c_sharp #async #httpwebrequest
На этот вопрос уже дан ответ здесь: Увеличить скорость парсера (1 ответ) Закрыт 2 года назад. Пытаюсь сделать множество асинхронных запросов HttpWebRequest. Подготовил мини тест: class Program { static void Main(string[] args) { Test(); Console.ReadLine(); } public static async void Test() { for (int i = 0; i < 10; i++) { int val = i; await Task.Run(() => WR(val)); } } static async void WR(int msg) { Console.WriteLine(msg + " begin"); string url = "https://stackoverflow.com"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; var response = (HttpWebResponse)await Task.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null); Console.WriteLine(msg + " status code: " + response.StatusCode); Console.WriteLine(msg + " end"); } } Но вот что получилось: 0 begin 1 begin 2 begin 3 begin 4 begin 5 begin 6 begin 7 begin 8 begin 9 begin 0 status code: OK 0 end 1 status code: OK 1 end А после 1 end вообще ничего не происходит. Где-то через 30 секунд в output вылазит: The thread 0x6634 has exited with code 0 (0x0). The thread 0x5620 has exited with code 0 (0x0). The thread 0x4d08 has exited with code 0 (0x0). The thread 0x39b8 has exited with code 0 (0x0). The thread 0x3454 has exited with code 0 (0x0). The thread 0x99c has exited with code 0 (0x0). The thread 0x6be0 has exited with code 0 (0x0). Но никаких ошибок в дебаге не вываливается. Подскажите где я ошибся и как исправить? UPDATE: Затык происходит при запуске в Visual Studio. Интересно что с включенным Fiddler все работает нормально.
Ответы
Ответ 1
Переписал немного ваш код. Все прекрасно работает void Main() { Test(); Console.ReadLine(); } public static async Task Test() { var tasks = new List(); for (int i = 0; i < 10; i++) { int val = i; var task = WR(val); tasks.Add(task); } await Task.WhenAll(tasks); } static async Task WR(int msg) { Console.WriteLine(msg + " begin"); string url = "https://stackoverflow.com"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; var response = (HttpWebResponse)await Task.Factory.FromAsync (request.BeginGetResponse, request.EndGetResponse, null); Console.WriteLine(msg + " status code: " + response.StatusCode); Console.WriteLine(msg + " end"); response.Dispose(); } Вывод 0 begin 1 begin 2 begin 3 begin 4 begin 5 begin 6 begin 7 begin 8 begin 9 begin 3 status code: OK 3 end 5 status code: OK 5 end 0 status code: OK 0 end 6 status code: OK 6 end 2 status code: OK 2 end 7 status code: OK 7 end 1 status code: OK 1 end 8 status code: OK 8 end 9 status code: OK 9 end 4 status code: OK 4 end UPD Не забываем диспозить респонс static async Task WR(int msg) { Console.WriteLine(msg + " begin"); string url = "https://stackoverflow.com"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; using (var response = (HttpWebResponse) await Task.Factory .FromAsync(request.BeginGetResponse, request.EndGetResponse, null)) //// <<<<< { Console.WriteLine(msg + " status code: " + response.StatusCode); Console.WriteLine(msg + " end"); } }
Комментариев нет:
Отправить комментарий