Страницы

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

суббота, 11 января 2020 г.

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

#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"); } }

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

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