У меня есть класс, который реализует шаблон Begin / End Invocation, где я изначально использовал ThreadPool.QueueUserWorkItem () для потоковой работы. Работа, выполняемая в потоке, не зацикливается, но занимает немного времени для обработки, поэтому сама работа не может быть легко остановлена.
Теперь у меня есть побочный эффект, когда кто-то, использующий мой класс, вызывает Begin (с обратным вызовом) множество раз, чтобы выполнить большую обработку, поэтому ThreadPool.QueueUserWorkItem создает тонну потоков для выполнения обработки. Это само по себе неплохо, но есть случаи, когда они хотят отказаться от обработки и начать новый процесс, но вынуждены ждать завершения своего первого запроса.
Поскольку ThreadPool.QueueUseWorkItem () не позволяет мне отменять потоки, я пытаюсь найти лучший способ поставить работу в очередь и, возможно, использовать явный метод FlushQueue () в моем классе, чтобы позволить вызывающей стороне отказаться от работы в моей очереди.
У кого-нибудь есть предложения по шаблону потоков, которые соответствуют моим потребностям?
Редактировать: В настоящее время я нацеливаюсь на структуру 2.0. В настоящее время я думаю, что очередь Consumer / Producer может работать. У кого-нибудь есть идеи по поводу очистки очереди?
Редактировать 2 Разъяснение проблемы:
Так как я использую шаблон Begin / End в своем классе каждый раз, когда вызывающая сторона использует Begin with callback, я создаю новый поток в пуле потоков. Этот вызов выполняет очень небольшую обработку и не там, где я хочу отменить. Это незавершенные задания в очереди, которые я хочу остановить.
Тот факт, что ThreadPool по умолчанию создаст 250 потоков на процессор, означает, что если вы попросите ThreadPool поставить в очередь большое количество элементов с помощью QueueUserWorkItem (), вы в конечном итоге создадите огромное количество параллельных потоков, которые невозможно остановить. .
Из-за способа, которым я поставил в очередь потоки, вызывающая сторона способна довести процессор до 100% не только работой, но и созданием работы.
Я думал, используя шаблон Producer / Consumer, я мог бы поставить эти потоки в очередь в свою собственную очередь, что позволило бы мне модерировать количество создаваемых мной потоков, чтобы избежать скачка ЦП при создании всех параллельных потоков. И что я мог бы позволить вызывающей стороне моего класса сбрасывать все задания в очереди, когда они оставляют запросы.
В настоящее время я пытаюсь реализовать это сам, но подумал, что было бы неплохо, чтобы кто-то сказал, взглянуть на этот код, иначе вы не сможете сбросить из-за этого, или сброс не подходит для этого термина.