Очистка ThreadPool - PullRequest
       20

Очистка ThreadPool

0 голосов
/ 21 сентября 2009

Я работаю над своим первым приложением ThreadPool в Visual Studio 2008 с C #.

У меня есть отчет, который должен выполнять расчеты от 2000 до 4000 деталей с использованием данных на нашем SQL Server.

Я ставлю в очередь все номера деталей в ThreadPool, где они отключаются и вычисляют свои результаты. Когда эти потоки завершаются, событие RegisterWaitForSingleObject инициирует отмену регистрации дескриптора поставленного в очередь элемента.

После завершения всех элементов в очереди, есть ли способ удалить их из ThreadPool?

Как это выглядит, если кто-то запускает другой отчет, используя новый набор из 2000-4000 деталей, я не могу удалить предыдущий массив деталей.

Как мне удалить ранее помещенные в очередь элементы? Будет ли это вызывать SetMaxThreads с workerThreads = 0?

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

Спасибо за ваше время,
Джо

Ответы [ 2 ]

4 голосов
/ 21 сентября 2009

Как только элемент ThreadPool завершается, он автоматически удаляется из очереди. Что указывает на то, что это не так?

2 голосов
/ 21 сентября 2009

Предполагая, что вы хотите прервать (отменить) работу в текущей очереди ...

Изменение max-threads не повлияет на ожидающую работу; он просто изменит количество потоков, доступных для этого - и вообще плохая идея возиться с этим (ваш код не единственный, кто использует ThreadPool). Я бы использовал пользовательскую очередь - довольно просто написать базовую (потокобезопасную) очередь производителя / потребителя, или .NET 4.0 включает в себя несколько очень хороших пользовательских потоков.

Тогда вы можете просто прервать пользовательскую очередь и начать новую.

Я написал простую здесь ; в данный момент он хочет завершить работу чисто (т. е. опустошить очередь до тех пор, пока она не станет пустой) перед завершением, но было бы достаточно легко добавить флаг для остановки сразу после текущего элемента (не прибегать к прерыванию / прерыванию потоков при произвольная точка исполнения; никогда не бывает хорошей идеей).

...