Остановка всех потоков в .NET ThreadPool? - PullRequest
4 голосов
/ 22 февраля 2011

Я использую ThreadPool в .NET для выполнения некоторых веб-запросов в фоновом режиме, и я хочу иметь кнопку «Стоп», чтобы отменить все потоки, даже если они находятся в процессе выполнения запроса, так что просто boolне сделаю работу.

Как я могу это сделать?

Ответы [ 3 ]

9 голосов
/ 06 октября 2011

Ваша ситуация в значительной степени является каноническим вариантом использования модели Cancellation в .NET Framework.

Идея состоит в том, что вы создаете CancellationToken объект и делаете его доступным для операции, которую вы, возможно, захотите отменить. Ваша операция иногда проверяет свойство токена IsCancellationRequested или вызывает ThrowIfCancellationRequested .

Вы можете создать CancellationToken и запросить отмену через него, используя CancellationTokenSource класс.

Эта модель отмены прекрасно интегрируется с .NET Task Parallel Library и довольно легкая, более того, чем использование системных объектов, таких как ManualResetEvent (хотя это тоже вполне допустимое решение).

5 голосов
/ 22 февраля 2011

Правильный способ справиться с этим - иметь объект-флаг, который вы сигнализируете.

Код, работающий в этих потоках, должен периодически проверять этот флаг, чтобы увидеть, должен ли он выйти.

Например, для этого подходит объект ManualResetEvent .

Затем вы можете попросить потоки выйти так:

evt.Set();

и внутри потоков, которые вы проверитедля этого так:

if (evt.WaitOne(0))
    return; // or otherwise exit the thread

Во-вторых, поскольку вы используете пул потоков, то происходит то, что все элементы, которые вы поставили в очередь, все равно будут обрабатываться, но если вы добавите оператор ifвыше, до самого начала метода потока, он немедленно завершится.Если этого недостаточно, вы должны построить свою собственную систему, используя обычные потоки, таким образом, вы получите полный контроль.

О, и просто чтобы убедиться, не не использует Thread.Abort.Попросите потоки красиво выйти, не убивайте их.

2 голосов
/ 22 февраля 2011

Если вы собираетесь остановить / отменить обработку чего-либо в другом потоке, ThreadPool - не лучший выбор, вы должны вместо этого использовать Thread и управлять всеми ими в контейнере (например, глобальном List<Thread>). , что гарантирует вам полный контроль над всеми потоками.

...