У меня есть довольно распространенный сценарий с потоками:
- У меня есть 100 идентичных заданий для выполнения
- Все вакансии независимы от каждого
другой
- Я хочу обработать максимум
15 рабочих мест одновременно
- как каждая работа
завершено, новая работа будет начата
пока все задания не будут выполнены
Если вы предполагаете, что каждое задание будет запускать событие, когда он завершит (я использую класс BackgroundWorker), я могу придумать пару способов справиться с этим, но я не уверен, что «правильно» решение есть. Я надеялся, что некоторые из вас, гуру, смогут направить меня в правильном направлении.
РЕШЕНИЕ 1: Имейте while (продолжить) {Threading.Sleep (1000); } цикл в моей функции Main (). Код в обработчике событий Job_Completed установит continue = false, если A) не осталось заданий, которые должны быть поставлены в очередь, и B) все поставленные в очередь задания завершены. Я использовал это решение раньше, и хотя оно, кажется, работает нормально ... оно кажется мне немного странным.
РЕШЕНИЕ 2: Используйте Application.Run () в моей функции Main (). Точно так же код в обработчике событий Job_Completed будет вызывать Application.Exit (), когда A) нет заданий, которые должны быть поставлены в очередь, и B) все задания в очереди завершены.
РЕШЕНИЕ 3: Используйте ThreadPool, поставьте в очередь все 500-1000 запросов, позвольте им запускаться по 10 одновременно (SetMaxThreads) и каким-то образом дождитесь их завершения.
Во всех этих решениях основная идея состоит в том, что новое задание будет запускаться каждый раз, когда другое задание будет выполнено, пока не останется ни одного задания. Таким образом, проблема заключается не только в ожидании завершения существующих заданий, но и в ожидании, когда больше не будет отложенных заданий для запуска. Если ThreadPool - правильное решение, как правильно ждать на ThreadPool, чтобы завершить все элементы в очереди?
Я думаю, что моя главная путаница в том, что я не совсем понимаю, КАК события могут запускаться из моей функции Main (). Очевидно, они понимают, я просто не понимаю механику этого с точки зрения цикла сообщений Windows. Как правильно решить эту проблему и почему?