Мультипоточность. Скорость выполнения не зависит от количества потоков - 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(); //намекнули циклу что можно пускать новый поток } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д