Проблема многопоточности C#

я пытаюсь упростить проблему следующим образом,

  1. у меня есть приблизительно 100 + файлы, что я хотел бы считать и затем обработать данные
  2. Для которого я поддерживаю массив имен файлов и местоположения
  3. Я порождаю потоки, чтобы сделать задание чтения файлов.

Теперь моя проблема, я хотел бы удостовериться, что только 5 потоков являются икрой за один раз как запуском 100 +, потоки не являются хорошей идеей вообще.

Поэтому скажите мне, что приближается, я должен использовать, чтобы гарантировать, что только 5 потоков работают во время и как только даже один из них сделан, новый может быть запущен.

Спасибо все,

5
задан Anil Namde 2 March 2010 в 05:10
поделиться

6 ответов

Я голосую за параллельную библиотеку задач / Rx (включенную в .NET 4.0, но загружаемую для 3.5):

        var options = new ParallelOptions();
        options.MaxDegreeOfParallelism = 5;

        Parallel.ForEach(GetListOFiles(), options, (file) =>
        {
             DoStuffWithFile(file);
        });

Обратите внимание, что это будет использовать до 5 потоков, но я видел это бесполезный.

4
ответ дан 18 December 2019 в 11:55
поделиться

Хотя это может не дать прямого ответа на ваш вопрос, но похоже, что дизайн производитель-потребитель будет соответствовать вашим потребностям. Кроме того, это может помочь.

2
ответ дан 18 December 2019 в 11:55
поделиться

Выполняйте обработку через ThreadPool, затем setMaxThreads

http://msdn.microsoft.com/en-us/library /system.threading.threadpool.setmaxthreads.aspx

1
ответ дан 18 December 2019 в 11:55
поделиться

Вам следует взглянуть на

system.threading.threadpool.setmaxthreads

4
ответ дан 18 December 2019 в 11:55
поделиться

Разделите список файлов на 5 списков одинакового размера. Затем запустите пять потоков и передайте каждому отдельный меньший список через ParameterizedThreadStart .

Однако, поскольку работа почти полностью связана с вводом-выводом, этот процесс вряд ли выиграет от многопоточности.

2
ответ дан 18 December 2019 в 11:55
поделиться

Обычно я использую такой подход:

Объявите общую целочисленную переменную для обозначения количества рабочих потоков. Когда задание назначено потоку (просто поставьте задание в очередь в ThreadPool), увеличьте значение. Когда поток завершит задание, уменьшите значение.

Убедитесь, что целочисленное значение увеличивается или уменьшается как атомарное.

В диспетчере заданий выберите задание и назначьте его потоку, только если количество рабочих потоков меньше максимального значения. В противном случае дождитесь сигнала (который будет инициирован рабочим потоком, завершающим задание). Если вы хотите, чтобы событие было проще, позвольте диспетчеру просто выполнить пустой цикл для ожидания.

Хорошим моментом является то, что максимальное значение настраивается и использует преимущества встроенного ThreadPool.Написание модели потребитель / производитель для решения такой небольшой проблемы стоит дорого.

2
ответ дан 18 December 2019 в 11:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: