Страницы

Поиск по вопросам

четверг, 28 февраля 2019 г.

c# множество асинхронных HttpWebRequest [дубликат]

На данный вопрос уже ответили: Увеличить скорость парсера 1 ответ Пытаюсь сделать множество асинхронных запросов 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 все работает нормально.


Ответ

Переписал немного ваш код. Все прекрасно работает
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"); } }

Комментариев нет:

Отправить комментарий