я пытаюсь упростить проблему следующим образом,
Теперь моя проблема, я хотел бы удостовериться, что только 5 потоков являются икрой за один раз как запуском 100 +, потоки не являются хорошей идеей вообще.
Поэтому скажите мне, что приближается, я должен использовать, чтобы гарантировать, что только 5 потоков работают во время и как только даже один из них сделан, новый может быть запущен.
Спасибо все,
Я голосую за параллельную библиотеку задач / Rx (включенную в .NET 4.0, но загружаемую для 3.5):
var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 5;
Parallel.ForEach(GetListOFiles(), options, (file) =>
{
DoStuffWithFile(file);
});
Обратите внимание, что это будет использовать до 5 потоков, но я видел это бесполезный.
Хотя это может не дать прямого ответа на ваш вопрос, но похоже, что дизайн производитель-потребитель будет соответствовать вашим потребностям. Кроме того, это может помочь.
Выполняйте обработку через ThreadPool, затем setMaxThreads
http://msdn.microsoft.com/en-us/library /system.threading.threadpool.setmaxthreads.aspx
Разделите список файлов на 5 списков одинакового размера. Затем запустите пять потоков и передайте каждому отдельный меньший список через ParameterizedThreadStart
.
Однако, поскольку работа почти полностью связана с вводом-выводом, этот процесс вряд ли выиграет от многопоточности.
Обычно я использую такой подход:
Объявите общую целочисленную переменную для обозначения количества рабочих потоков. Когда задание назначено потоку (просто поставьте задание в очередь в ThreadPool), увеличьте значение. Когда поток завершит задание, уменьшите значение.
Убедитесь, что целочисленное значение увеличивается или уменьшается как атомарное.
В диспетчере заданий выберите задание и назначьте его потоку, только если количество рабочих потоков меньше максимального значения. В противном случае дождитесь сигнала (который будет инициирован рабочим потоком, завершающим задание). Если вы хотите, чтобы событие было проще, позвольте диспетчеру просто выполнить пустой цикл для ожидания.
Хорошим моментом является то, что максимальное значение настраивается и использует преимущества встроенного ThreadPool.Написание модели потребитель / производитель для решения такой небольшой проблемы стоит дорого.