Мультипоточность. Скорость выполнения не зависит от количества потоков - C#
Формулировка задачи:
Всем привет! В общем есть такая проблемка - делаю в своем приложении мультипоточность. Проблема в том, что хоть 10, хоть 100 потоков по скорости работают одинаково. Я конечно понимаю, как работают потоки, и что выше определенного значения не прыгнешь. Но, к примеру, у программ на дельфи есть такое, что сколько потоков задаешь, столько и выполняется одновременно(ну или очень быстро). Как можно добиться такого в приложении на шарпе?
Решение задачи: «Мультипоточность. Скорость выполнения не зависит от количества потоков»
textual
Листинг программы
class Program
{
private const int MaxThread = 5; // максимальное кол-во потоков
private static Queue<string> proxyes; //глобальная очередь проксей
private static readonly Object sync = new object(); //объект для синхронизации потоков
private static readonly AutoResetEvent reset = new AutoResetEvent(false); //сигнализатор для потоков
private static readonly List<Thread> threads = new List<Thread>(); //список потоков
static void Main()
{
string[] accounts = File.ReadAllLines("accounts.txt"); //получили все аккаунты
proxyes = new Queue<string>(File.ReadAllLines("proxy.txt")); // и все прокси
foreach (string account in accounts) //перебераем все акки
{
Thread worker = new Thread(Brute); //для каждого акка создаем новый поток
worker.Start(account); //запускаем его с параметром
threads.Add(worker); //и добавляем в список запущеных потоков
if (threads.Count >= MaxThread) reset.WaitOne(); //если потокв больше чем должно быть то ждем окончания
}
Console.WriteLine("Press any key...");
Console.ReadKey(true);
}
private static void Brute(object param)
{
string login = ((string)param).Split(';')[0]; //получили логин
string pass = ((string)param).Split(';')[1]; //и пароль
string proxy;
lock (sync)
{
proxy = proxyes.Dequeue(); //вытащили прокси из очереди
proxyes.Enqueue(proxy); //и запихнули в конец очереди, то есть зациклили
}
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("ССЫЛКА" + login + pass); //составили запрос
request.Proxy = new WebProxy(proxy); //привязали к запросу полученую проксю
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // и т.д.
// etc
lock(sync) threads.Remove(Thread.CurrentThread); //обезопалили удаление потока из списка
reset.Set(); //намекнули циклу что можно пускать новый поток
}
}