Параллельные запросы

  • Автор темы Автор темы Wide
  • Дата начала Дата начала

Wide

Client
Регистрация
04.02.2013
Сообщения
981
Реакции
265
Баллы
63
Есть код от ChatGPT

C#:
Развернуть Свернуть Копировать
using System;
using System.IO;
using System.Net;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var requestCount = 10;
            var proxyAddress = "255.255.255.255";
            var proxyPort = 99999;
            var proxyUsername = "login";
            var proxyPassword = "password";

            var proxy = new WebProxy($"http://{proxyAddress}:{proxyPort}");
            proxy.Credentials = new NetworkCredential(proxyUsername, proxyPassword);

            var tasks = new Task[requestCount];
            for (int i = 0; i < requestCount; i++)
            {
                tasks[i] = Task.Run(() => MakeGetRequest(proxy));
            }

            Task.WaitAll(tasks);

            foreach (var task in tasks)
            {
                Console.WriteLine(task.Result);
            }

            Console.ReadLine();
        }

        static string MakeGetRequest(IWebProxy proxy)
        {
            var url = "https://site.ru/";
            var request = (HttpWebRequest)WebRequest.Create(url);
            request.Proxy = proxy;

            using (var response = (HttpWebResponse)request.GetResponse())
            using (var streamReader = new StreamReader(response.GetResponseStream()))
            {
                var result = streamReader.ReadToEnd();
                return $"Status code: {response.StatusCode}\nContent: {result}";
            }
        }
    }
}

Добавил в юзинг
C#:
Развернуть Свернуть Копировать
using System.Net;
using System.Threading.Tasks;

Вопрос. Как правильно добавить код в кубик? Если я правильно понимаю то все что между:
C#:
Развернуть Свернуть Копировать
static async Task Main(string[] args)
        {
        }

Если так, тогда я правильно копирую, но один хер ругается, а жпт не объяснить что код будет выполняться в другой среде.

Screenshot_10.png
 
Screenshot_11.png
 
Если в 1 кубике хочешь что бы было.


C#:
Развернуть Свернуть Копировать
Func<IWebProxy, string> MakeGetRequest = pr =>
{
    var url = "https://site.ru/";
    var request = (HttpWebRequest) WebRequest.Create(url);
    request.Proxy = pr;

    using (var response = (HttpWebResponse) request.GetResponse())
        using (var streamReader = new StreamReader(response.GetResponseStream()))
    {
        var result = streamReader.ReadToEnd();
        return $"Status code: {response.StatusCode}\nContent: {result}";
    }
};

var requestCount = 10;
var proxyAddress = "255.255.255.255";
var proxyPort = 99999;
var proxyUsername = "login";
var proxyPassword = "password";

var proxy = new WebProxy($"http://{proxyAddress}:{proxyPort}");
proxy.Credentials = new NetworkCredential(proxyUsername, proxyPassword);

Task<string>[] tasks = new Task<string>[requestCount];
for (int i = 0; i < requestCount; i++)
{
    tasks[i] = Task.Run(() => MakeGetRequest(proxy));
}

Task.WaitAll(tasks);

foreach (var task in tasks)
{
    project.SendInfoToLog(task.Result);
}

Удали из общего кода 23 строку.
и добавь в директивы using

using System.Net;
using System.Threading.Tasks;
 
Если в 1 кубике хочешь что бы было.


C#:
Развернуть Свернуть Копировать
Func<IWebProxy, string> MakeGetRequest = pr =>
{
    var url = "https://site.ru/";
    var request = (HttpWebRequest) WebRequest.Create(url);
    request.Proxy = pr;

    using (var response = (HttpWebResponse) request.GetResponse())
        using (var streamReader = new StreamReader(response.GetResponseStream()))
    {
        var result = streamReader.ReadToEnd();
        return $"Status code: {response.StatusCode}\nContent: {result}";
    }
};

var requestCount = 10;
var proxyAddress = "255.255.255.255";
var proxyPort = 99999;
var proxyUsername = "login";
var proxyPassword = "password";

var proxy = new WebProxy($"http://{proxyAddress}:{proxyPort}");
proxy.Credentials = new NetworkCredential(proxyUsername, proxyPassword);

Task<string>[] tasks = new Task<string>[requestCount];
for (int i = 0; i < requestCount; i++)
{
    tasks[i] = Task.Run(() => MakeGetRequest(proxy));
}

Task.WaitAll(tasks);

foreach (var task in tasks)
{
    project.SendInfoToLog(task.Result);
}

Удали из общего кода 23 строку.
и добавь в директивы using

using System.Net;
using System.Threading.Tasks;
в тот то и дело что в юзинги добавил

Screenshot_14.png
 
в тот то и дело что в юзинги добавил

Посмотреть вложение 109385
Если в 1 кубике хочешь что бы было.


C#:
Развернуть Свернуть Копировать
Func<IWebProxy, string> MakeGetRequest = pr =>
{
    var url = "https://site.ru/";
    var request = (HttpWebRequest) WebRequest.Create(url);
    request.Proxy = pr;

    using (var response = (HttpWebResponse) request.GetResponse())
        using (var streamReader = new StreamReader(response.GetResponseStream()))
    {
        var result = streamReader.ReadToEnd();
        return $"Status code: {response.StatusCode}\nContent: {result}";
    }
};

var requestCount = 10;
var proxyAddress = "255.255.255.255";
var proxyPort = 99999;
var proxyUsername = "login";
var proxyPassword = "password";

var proxy = new WebProxy($"http://{proxyAddress}:{proxyPort}");
proxy.Credentials = new NetworkCredential(proxyUsername, proxyPassword);

Task<string>[] tasks = new Task<string>[requestCount];
for (int i = 0; i < requestCount; i++)
{
    tasks[i] = Task.Run(() => MakeGetRequest(proxy));
}

Task.WaitAll(tasks);

foreach (var task in tasks)
{
    project.SendInfoToLog(task.Result);
}

Удали из общего кода 23 строку.
и добавь в директивы using

using System.Net;
using System.Threading.Tasks;
Screenshot_15.png

Screenshot_17.png

Всё же правильно, или нет?
 
Не любишь читать что пишу)
и добавь в директивы using

using System.Net;
using System.Threading.Tasks;
109390
 
  • Оценить
Реакции: Wide

Вложения

  • test.zp
    test.zp
    9,1 KB · Просмотры: 2
Друг прости за наглость, не подскажешь как добавить ожидание выполнения всех потоков? Жпт добавляет в конец строку
await Task.WhenAll(tasks); // ожидаем выполнение всех задач

только вот в логе ошибка
The await operator can only be used within an async method. Consider marking this method with the async modifier and changing its return type to Task<object>

вот мой код
C#:
Развернуть Свернуть Копировать
Func<IWebProxy, string> MakeGetRequest = pr =>
{
    var url = "https://site.ru/";
    var request = (HttpWebRequest) WebRequest.Create(url);
    request.Proxy = pr;
    request.Timeout = 60000; // устанавливаем максимальное время ожидания ответа в 60 секунд

    var stopwatch = new Stopwatch();
    stopwatch.Start(); // запускаем секундомер

    using (var response = (HttpWebResponse) request.GetResponse())
        using (var streamReader = new StreamReader(response.GetResponseStream()))
    {
        stopwatch.Stop(); // останавливаем секундомер
        var result = streamReader.ReadToEnd();
        var logMessage = $"Status code: {(int)response.StatusCode} / Time taken: {stopwatch.Elapsed.TotalSeconds:F2} seconds";
        return logMessage;
    }
};

var requestCount = 10;
var proxyUsername = project.Variables["proxy_login"].Value;
var proxyPassword = project.Variables["proxy_password"].Value;
var proxyAddress = project.Variables["proxy_ip"].Value;
var proxyPort = project.Variables["proxy_port"].Value;

var proxy = new WebProxy($"http://{proxyAddress}:{proxyPort}");
proxy.Credentials = new NetworkCredential(proxyUsername, proxyPassword);

for (int i = 0; i < requestCount; i++)
{
    Task.Run(async () =>
    {
        await Task.Delay(new Random().Next(1000, 5000)); // случайная задержка от 1 до 5 секунд
        try
        {
            var result = MakeGetRequest(proxy);
            project.SendInfoToLog(result); // выводим результат в лог
        }
        catch (WebException ex)
        {
            project.SendInfoToLog($"WebException: {ex.Message}"); // выводим ошибку в лог
        }
        catch (Exception ex)
        {
            project.SendInfoToLog($"Exception: {ex.Message}"); // выводим ошибку в лог
        }
    });
}
 
  • Оценить
Реакции: Wide
Ключевыми для работы с асинхронными вызовами в C# являются два оператора: async и await https://metanit.com/sharp/tutorial/13.3.php
так же есть Parallel.For https://metanit.com/sharp/tutorial/12.4.php

думаю ИИ знает про это :ap:
Если я правильно понял, то async он добавил для потоков, а await для ожидания, всё верно. Только вот насколько я понял из ошибки, что в его коде что то не совместимо. Хз не шарю, на факт что код не воркает. Мне нужно ожидание, т.к. нет смысла от многопотока если шаблон выполняется а потоки нет.
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)