У меня есть очередь (на самом деле 3 разные очереди, но я не верю, что это будет иметь значение). Очередь содержит дискретные единицы работы.
У меня есть QueueManager, который порождает новый поток и возвращается. Новый поток просматривает очередь, получает часть работы, а затем порождает новый поток для ее обработки.
Я, очевидно, хочу ограничить количество одновременных потоков и не вижу причин не использовать повторно поток после завершения работы.
Для выполнения некоторых заданий потребуется некоторое время (минуты/часы), и я читал, что ThreadPool не является хорошим вариантом для всего, что занимает более нескольких секунд.
По сути, я хочу реализовать ThreadPool, но с немного большим контролем.
Итак... Каков стандартный и лучший способ добиться этого?
Кажется, мне нужно (при условии, что длина очереди> MaxThreadCount)
- Создавайте новые задания, пока я не нажму
MaxThreadCount - Дождитесь завершения любого потока
- Получить следующее задание из очереди и назначить его потоку
- Повторить
- Если очередь пуста, подождите некоторое время, а затем перепроверьте
(Очередь в этом случае находится в базе данных, поэтому при добавлении элементов нет событий - я предполагаю, что мне просто нужно будет опросить)
Многие задания связаны с повторным получением страниц с удаленных сайтов/API. Таким образом, я считаю, что мне было бы полезно иметь значительно больше потоков, чем ядер (поскольку большинство из них будут ждать сети). Таким образом, я не считаю WaitHandle подходящим, поскольку он имеет ограничение в 64 потока.
Это, очевидно, довольно распространенный шаблон, поэтому я предполагаю, что должен быть хорошо зарекомендовавший себя способ его реализации?
Если бы кто-то мог указать мне на хороший пример, это было бы превосходно.