• Как увеличить количество запросов к серверу за минимальное время?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Попробуйте использовать HttpClient:

    private async Task<string> Get(string url)
    {
      using (var client = new HttpClient())
      {
        using (var r = await client.GetAsync(new Uri(url)))
        {
          return await r.Content.ReadAsStringAsync();
        }
      }
    }

    Но придется вызов метода Get делать с await, и далее по цепочке вверх, добавлять async/await:

    string result = await Get("https://toster.ru/q/470456");

    В качестве альтернативного варианта, можно запускать запросы асинхронно и передавать результат выполнения запроса в функцию. С вашим кодом, примерно так:

    private void Get(string url)
    {
      Task.Run(async () =>
      {
        WebRequest req = WebRequest.Create(url);
        WebResponse resp = await req.GetResponseAsync();
        Stream stream = resp.GetResponseStream();
        StreamReader sr = new StreamReader(stream);
    
        string result = await sr.ReadToEndAsync();
    
        sr.Close();
    
        // передаем результат
        ResultCallback(url, result);
      });
    }
    
    private void ResultCallback(string url, string result)
    {
      // выводим в консоль результат
      Console.WriteLine(url);
      Console.WriteLine(result);
    }

    Аналогичный вариант с HttpClient
    private void Get(string url)
    {
      Task.Run(async () =>
      {
        using (var client = new HttpClient())
        {
          using (var r = await client.GetAsync(new Uri(url)))
          {
            string result = await r.Content.ReadAsStringAsync();
    
            ResultCallback(url, result);
          }
        }
      });
    }
    Обертка кода, указанного в тексте вопроса, с минимальными изменениями
    private void Get(string url)
    {
      // выполняем запрос в отдельном потоке
      Task.Run(() =>
      {
        WebRequest req = WebRequest.Create(url);
        WebResponse resp = req.GetResponse();
        Stream stream = resp.GetResponseStream();
        StreamReader sr = new StreamReader(stream);
    
        string result = sr.ReadToEnd();
    
        sr.Close();
    
        // передаем результат в функцию обратного вызова
        ResultCallback(url, result);
      });
    }
    
    private void ResultCallback(string url, string result)
    {
      Console.WriteLine(url);
      Console.WriteLine(result);
    }
    Вариант с оберткой Thread, если используются старая версия .NET
    private void Get(string url)
    {
      // создаем поток
      var t = new Thread(() =>
      {
        WebRequest req = WebRequest.Create(url);
        WebResponse resp = req.GetResponse();
        Stream stream = resp.GetResponseStream();
        StreamReader sr = new StreamReader(stream);
    
        string result = sr.ReadToEnd();
    
        sr.Close();
    
        ResultCallback(url, result);
      });
    
      // запускаем
      t.Start();
    }
    
    private void ResultCallback(string url, string result)
    {
      Console.WriteLine(url);
      Console.WriteLine(result);
    }
    Ответ написан
    Комментировать