0

Вообщем, я сделал прокси чекер, но теперь встал вопрос: как распараллелить выполнение кода, повысив эффективность выполнения программы. Буду очень рад, если вы не просто мне укажите, что надо использовать, а конкретно приведете изменённый код. Я вас тогда просто расцелую! Вот исходный код:

using System;
using System.Collections;
using System.IO;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web;

class RegistriUAAccs {

static void Main()
{
    Console.WriteLine("Введите ссылку на файл TXT, где хранятся ваши прокси.");
    string fm = Console.ReadLine();

    //Объява переменных 
    string reader = null;
    string writetoprox = null;
    bool checkadd = false;

    //Объява массивов.
    ArrayList msproxy = new ArrayList();
    //


    using (StreamReader sr = new StreamReader(@fm))
    {
        reader = sr.ReadToEnd();
    }
    // Console.WriteLine(reader);
    // Этот цикл foreach считывает прокси в msproxy без пробелов, \t , \n. Только прокси и порт считывает.
    foreach (char r in reader)
    {
        if (r != ' ' & r != '\r' & r != '\n')
        {
            writetoprox += r;
            checkadd = false;
        }
        else
        {
            if (checkadd == false)
            {
                msproxy.Add(writetoprox);
            }
            checkadd = true;
            writetoprox = null;
        }
    }
    int cv = 0;
    // Тут try / catch оборачивается в for для того, чтобы переходить к следующей прокси, если прошлая оказалась недействительна.
    for (int j = 0; j < msproxy.Count; j++)
    {
        try
        {
            // Чек прокси
            for (int i = j; i < msproxy.Count; i++)
            {
                cv = i;
                WebProxy proxy = new WebProxy(msproxy[i].ToString(), true);
                HttpWebRequest req = HttpWebRequest.CreateHttp("https://www.google.com/");
                req.Proxy = proxy;
                req.Timeout = 3000;
                var Response = (HttpWebResponse)req.GetResponse();
                var RespString = new StreamReader(Response.GetResponseStream()).ReadToEnd();
                FileStream fs = new FileStream("Good.txt", FileMode.Append);
                using (StreamWriter write = new StreamWriter(fs))
                {
                    write.WriteLine(msproxy[cv]);
                }

                Console.WriteLine(msproxy[cv] + " ВЕРНО!!!!!!");
            }
        }
        // Если прокси не рабочая, то вылавливаем это, а затем записываем в файл и выводим известие об этом на экран.
        catch (System.Net.WebException)
        {
            Console.WriteLine();


            FileStream fs = new FileStream("Bad.txt", FileMode.Append);
            using (StreamWriter sw = new StreamWriter(fs))
            {
                string proxys = msproxy[cv].ToString();
                sw.WriteLine(proxys);
            }


            Console.WriteLine(msproxy[cv] + " Неверно!");
            continue;
        }
    }
}



}

  • Немного подправил некоторые ошибки в коде и в тексте. Заранее прошу прощение, если что-то не так. – CsHarpUser Oct 10 '20 at 16:18
  • 3
    Забудьте про HttpWebRequest, он в C# устарел! Также, научитесь использовать async/await, а также, предположу, что это дубликат. – EvgeniyZ Oct 10 '20 at 16:19
  • @EvgeniyZ В каком смысле дубликат? – CsHarpUser Oct 10 '20 at 16:21
  • типа такой вопрос уже задавался и ответ на него можно найти на сервисе – Andrew Stop_RU_war_in_UA Oct 10 '20 at 16:23
  • @Andrew, уже понял, :D – CsHarpUser Oct 10 '20 at 16:24
  • @EvgeniyZ Жаль, что на всех SO нельзя выпилить все вопросы и ответы, в которых упоминается HttpWebRequest. :) – aepot Oct 10 '20 at 16:38
  • @aepot Ну это было бы лишним, ибо в некоторых случаях он еще является единственным и неповторимым. Не будете вы ведь переписывать уже готовый проект под HttpClient, когда надо исправить всего 1 недостаток. Тут бы плашку какую-то, как вон атрибут obsolete в c#, но это явно не будут делать ради таких целей) – EvgeniyZ Oct 10 '20 at 16:41
  • @aepot Откуда такая ненависть к этому классу? :D Или по-вашему новичкам надо сразу окунаться в какие-то сложные для понимания классы. – CsHarpUser Oct 10 '20 at 16:41
  • @CsHarpUser Почитайте документацию, это рекомендация Microsoft, они его уже давно не развивают (а также все, что на нем базируется), он попросту заброшен. Мы лишь следуем их советам и предупреждаем про это других. – EvgeniyZ Oct 10 '20 at 16:43
  • 3
    А как будешь относиться у нему, если ты когда-то его использовал, потому что нашел на StackOverflow, 2 месяца мучался, не мог понять, почему все так медленно работает, перешел на HttpClient, выучил async/await, и теперь данные из API грузятся не 5 минут, а 10 секунд. HttpWebRequest убил очень много моего времени, я его терпеть не могу. И да, код, который был 200 строк, стал 50 после переработки, так что неизвестно, что из этого сложнее. – aepot Oct 10 '20 at 16:44
  • @aepot Тогда спору нет, согласен. – CsHarpUser Oct 10 '20 at 16:45
  • if (r != ' ' & r != '\r' & r != '\n') - посмотрите примеры использования string.Split(). Весь этот блок можно в одну не очень длинную строку переписать. И посмотрите, чем отличается && от & и || от |. ArrayList можно заменить на List<string>, тогда не придется вызывать .ToString(). Еще метод File.WriteAllLines() вам может пригодиться. – aepot Oct 10 '20 at 16:48
  • @aepot Спасибо большое, что подметили, но на данный момент мне надо разобраться с параллельной проверкой прокси и с потоками, а потом уже переходить к улучшению кода. – CsHarpUser Oct 10 '20 at 16:52
  • reader = sr.ReadToEnd(); - уберите StreamReader и используйте reader = File.ReadAllText(fm). – aepot Oct 10 '20 at 16:54
  • По поводу "потом разберусь" - то что я предлагаю, будет раз в 50 быстрее работать, чем ваша посимвольная сборка строк. Вы же хотели ускориться. – aepot Oct 10 '20 at 16:56
  • @aepot Нет, я тогда неправильно выразил свою мысль. Моё дело ни сколько сделать реальную программу, которая быстро работает ( хотя и это тоже ), а и еще проверить себя на то, как я помню выученный материал, а также попрактиковаться с использованием потоков ( ибо, как выяснилось сейчас, я эту тему не очень усвоил ). – CsHarpUser Oct 10 '20 at 16:59

1 Answers1

2

Моё дело ни сколько сделать реальную программу, которая быстро работает ( хотя и это тоже ), а и еще проверить себя на то, как я помню выученный материал

Ну тогда вот вам для разминки.

static async Task Main()
{
    string date = DateTime.Now.ToString("dd-MM-YYYY_HH-mm");
    Console.WriteLine("Введите ссылку на файл TXT, где хранятся ваши прокси.");
    string fm = Console.ReadLine();
string proxies = File.ReadAllText(fm);
string[] msproxy = proxies.Split(new[] { ' ', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);

string url = &quot;https://www.google.com/&quot;;

using (StreamWriter swGood = new StreamWriter($&quot;{date}_Good.txt&quot;))
using (StreamWriter swBad = new StreamWriter($&quot;{date}_Bad.txt&quot;))
{
    foreach (string proxy in msproxy)
    {
        try
        {
            HttpClientHandler handler = new HttpClientHandler() { Proxy = new WebProxy(proxy, true) };
            using (HttpClient client = new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(3) })
            using (HttpResponseMessage response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead))
            {
                if (response.IsSuccessStatusCode)
                {
                    swGood.WriteLine(proxy);
                    Console.WriteLine(&quot;{0} Верно!&quot;, proxy);
                }
                else
                {
                    swBad.WriteLine(proxy);
                    Console.WriteLine(&quot;{0} Неверно!&quot;, proxy);
                }
            }
        }
        catch (Exception ex)
        {
            swBad.WriteLine(proxy);
            Console.WriteLine(&quot;{0} Ошибка! {1}&quot;, proxy, ex.Message);
        }
    }
}

}

По поводу потоков, нужно знать, .NET Core или Framework. Нужно настроить нормальное закрытие сокетов после запроса, иначе компьютеру может стать плохо. Тогда можно будет распараллелить. Но то что я показал выше, уже должно значительно быстрее работать.

aepot
  • 49,560