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

Wide

Client
Регистрация
04.02.2013
Сообщения
944
Благодарностей
252
Баллы
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
 

Wide

Client
Регистрация
04.02.2013
Сообщения
944
Благодарностей
252
Баллы
63
Screenshot_11.png
 

xASZx

Client
Регистрация
24.11.2017
Сообщения
70
Благодарностей
15
Баллы
8
Если в 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;
 

Wide

Client
Регистрация
04.02.2013
Сообщения
944
Благодарностей
252
Баллы
63
Если в 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
 

xASZx

Client
Регистрация
24.11.2017
Сообщения
70
Благодарностей
15
Баллы
8
Я же писал, удали 23 строку)
109386
 
  • Спасибо
Реакции: Wide

Wide

Client
Регистрация
04.02.2013
Сообщения
944
Благодарностей
252
Баллы
63
в тот то и дело что в юзинги добавил

Посмотреть вложение 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

Всё же правильно, или нет?
 

xASZx

Client
Регистрация
24.11.2017
Сообщения
70
Благодарностей
15
Баллы
8
Не любишь читать что пишу)
и добавь в директивы using

using System.Net;
using System.Threading.Tasks;
109390
 
  • Спасибо
Реакции: Wide

Wide

Client
Регистрация
04.02.2013
Сообщения
944
Благодарностей
252
Баллы
63

Вложения

  • 9,1 КБ Просмотры: 2

xASZx

Client
Регистрация
24.11.2017
Сообщения
70
Благодарностей
15
Баллы
8
Это все можешь удалить
109392
 

xASZx

Client
Регистрация
24.11.2017
Сообщения
70
Благодарностей
15
Баллы
8
Лови)
 

Вложения

  • 9,3 КБ Просмотры: 7
  • Спасибо
Реакции: Wide

Wide

Client
Регистрация
04.02.2013
Сообщения
944
Благодарностей
252
Баллы
63

Wide

Client
Регистрация
04.02.2013
Сообщения
944
Благодарностей
252
Баллы
63
Друг прости за наглость, не подскажешь как добавить ожидание выполнения всех потоков? Жпт добавляет в конец строку
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}"); // выводим ошибку в лог
        }
    });
}
 

Ахилес

Client
Регистрация
11.11.2020
Сообщения
870
Благодарностей
353
Баллы
63
  • Спасибо
Реакции: Wide

Wide

Client
Регистрация
04.02.2013
Сообщения
944
Благодарностей
252
Баллы
63
Ключевыми для работы с асинхронными вызовами в C# являются два оператора: async и await https://metanit.com/sharp/tutorial/13.3.php
так же есть Parallel.For https://metanit.com/sharp/tutorial/12.4.php

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

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