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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5
Похожие ответы