0
List<string> cookielist = new List<string>(); //список куки
List<string> dirs = new List<string>(); //список файлов в папке(заполняется до старта)

 private void StartThread() //Создаем цикл потоков
            {
                if (dirs.Count > 0) //если строки в листе присутствуют , то...
                {
                    var options = new ParallelOptions(); //опции паралели
                    options.MaxDegreeOfParallelism = guna2TrackBar1.Value; //кол-во паралельных потоков
                    Parallel.ForEach(dirs, options, dir => Run(dir)); //запускаем паралельный чек
                    MessageBox.Show("Чек окончен!", "Внимание!",MessageBoxButtons.OK,MessageBoxIcon.Error); //выведется когда все папки пройдут
                }
            }
            /*
             * ==================================================================================
             * СТАРТ ЧЕКА==================================================================================
             * ==================================================================================
             */
            private void Run(string dir) //передаем в поток папку
            {
                string[] files = Directory.GetFiles(dir); //ищем файлы в выбранной папке
                foreach (string file in files) //перебираем файлы в папке
                {
                    if (file.Contains("ookie")) //если в название есть " " .а конкретнее cookie
                    {
                        cookielist = File.ReadAllLines(file).ToList(); // прочитать его в List cookie
                    }
                }
            }

Как будет использоваться Список List<string> cookielist?

  1. Список cookielist будет перезаписываться каждым потоком
  2. Список cookielist будет общим для всех паралельных потоков(все файлы будут записаны в 1 лист)
  3. Список cookielist будет для каждого индивидуальный
aepot
  • 49,560
Kain
  • 11
  • 2
  • 1
    List не является потокобезопасной коллекцией. Если вас интересует, чтобы было правильно и надёжно - используйте потокобезопасные коллекции, чтобы не зависеть от конкретики процессора, версии фреймворка и температуры процессора. – A K Feb 04 '21 at 07:39
  • @AK хорошо. В таком случае как лучше это реализовать? Необходимо , чтобы у каждого паралельного потока был свой лист с куками – Kain Feb 04 '21 at 07:41
  • Нет никакого смысла распараллеливать доступ к диску. Так как драйвер файловой системы все равно все эти операции будет пережевывать в одном потоке на одном ядре процессора. Какую именно задачу вы решаете? – aepot Feb 04 '21 at 07:51
  • 2
    System.Collections.Concurrent - коллекции из этого пространства имён потокобезопасные. Используйте их, когда нужен доступ из нескольких потоков. – Alexander Petrov Feb 04 '21 at 07:59
  • Это просто тест? Тогда Список cookielist будет перезаписываться каждым потоком, это ж очевидно. – aepot Feb 04 '21 at 08:00
  • @aepot многопоточный парсер.

    Указываем кол-во потоков , файл с куками , тыкаем старт. Парсер используя куки заходит на сайт через GET запрос и собирает необходимую информацию, после чего выплевывает ее в txt файл , разделяя по категориям. В одном потоке это прекрасно работает, в многопотоке значительно сложнее.

    Файл куки для каждого потока должен быть уникальным

    – Kain Feb 04 '21 at 08:01
  • Конекретизируйте вопрос, пока не понятно: 1) этот код работает? 2) этот код должен работать? 3) что за фразы под кодом и почему они не связаны логически, а выглядят как варианты ответа на тестирование? 4) по-вашему в чем смысл параллельности здесь? 5) в чем собственно вопрос? конкретизируйте его так, чтобы можно было дать конкретный объективный ответ. – aepot Feb 04 '21 at 08:05
  • @aepot Код работает не правильно. Он перезаписывает лист, а лист должен быть у каждого потока свой личный.

    Логика программы должна быть такая:

    1. Выбираем папку с папками. через цикл foreach записываем все пути папок в лист
    2. Нажимаем на GUI "старт"

    3 . StartThread() Создаем колличество потоков = trackbar.Value и запускаем их 4. Run() Каждый поток из свой папки находит файл с именем cookie и записывает его содержимое в виде строк 5. Далее ели набор сайтов на которые нужно зайти если имеются куки от этого сайта.

    Вот весь код

    https://whosts.ru/gV38z9Rq0L

    – Kain Feb 04 '21 at 08:45
  • Вы уже определитесь: в одном месте вы пишете про GET-запросы на сайт, в другом - про чтение файлов. Зачем вообще промежуточные файлы? – Alexander Petrov Feb 04 '21 at 08:49
  • @AlexanderPetrovпотому что сначала надо разобраться с чтением файлов , а потом уже переходить к GET запросам – Kain Feb 04 '21 at 09:12
  • Если вам нужен HttpClient с сохраняемыми куками - то вот пример. – aepot Feb 04 '21 at 09:12
  • @aepot я через xNet запросы отправляю, пока не подводил. Самое сложное на данный момент, это сделать, чтобы у отдельного потока был отдельный List с куками – Kain Feb 04 '21 at 12:05
  • Так, а зачем вам потоки, если обращение к сети - это асинхронная операция? Я могу не используя ни одного дополнительного потока выполнять сколько угодно одновременных обращений к серверам. Асинхронное программирование? К тому же это работать будет быстрее, чем в потоках, потому что я не буду тратить ресурсы процессора на спавн лишних потоков. Вам надо ощутить разницу между асинхронностью и многопоточностью. И то и другое позволяет делать что-то одновременно, только потоки - это процессор, а асинхронность - это аппаратная фишка. – aepot Feb 04 '21 at 12:37
  • @aepot Потоки необходимы для того чтобы проверять сразу несколько разных файлов с куки, отправлять запросы с ними(разными) и т.д. – Kain Feb 04 '21 at 13:00
  • Файлы тоже (внезапно) можно читать и писать асинхронно. string[] lines = await File.ReadAllLinesAsync(file); И если бы вы перешли по ссылке и почитали бы про асинхронность, то поняли бы разницу между I/O асинхронной операцией и CPU асинхронной операцией. Вы уверены, что вам это не нужно знать? – aepot Feb 04 '21 at 13:05

0 Answers0