Как распараллелить код, дабы он выполнялся эффективнее?
Вообщем, я сделал прокси чекер, но теперь встал вопрос: как распараллелить выполнение кода, повысив эффективность выполнения программы. Буду очень рад, если вы не просто мне укажите, что надо использовать, а конкретно приведете изменённый код. Я вас тогда просто расцелую! Вот исходный код:
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 шт):
Моё дело ни сколько сделать реальную программу, которая быстро работает ( хотя и это тоже ), а и еще проверить себя на то, как я помню выученный материал
Ну тогда вот вам для разминки.
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. Нужно настроить нормальное закрытие сокетов после запроса, иначе компьютеру может стать плохо. Тогда можно будет распараллелить. Но то что я показал выше, уже должно значительно быстрее работать.