Как распараллелить код, дабы он выполнялся эффективнее?

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

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;
            }
        }
    }
 
 
 
}

Ответы (1 шт):

Автор решения: aepot

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

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

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 = "https://www.google.com/";
           
    using (StreamWriter swGood = new StreamWriter($"{date}_Good.txt"))
    using (StreamWriter swBad = new StreamWriter($"{date}_Bad.txt"))
    {
        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("{0} Верно!", proxy);
                    }
                    else
                    {
                        swBad.WriteLine(proxy);
                        Console.WriteLine("{0} Неверно!", proxy);
                    }
                }
            }
            catch (Exception ex)
            {
                swBad.WriteLine(proxy);
                Console.WriteLine("{0} Ошибка! {1}", proxy, ex.Message);
            }
        }
    }
}

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

→ Ссылка