Если вы используете BackgroundWorker
, то у вас уже есть вся инфраструктура, необходимая для отмены операции. Просто установите WorkerSupportsCancellation
на true
на BackgroundWorker
и вызовите метод рабочего CancelAsync
, если вы хотите отменить.
Очевидно, что вы должны написать рабочий код, чтобы почтить отмена. Вы делаете это, проверяя свойство CancellationPending
BackgroundWorker
.
MSDN имеет example, используя эту собственность.
Примечание - Я немного смущен комбинацией BackgroundWorker
и 20 потоков; a BackgroundWorker
использует только один поток. Вы вращаетесь 20 BackgroundWorkers
? Если да, то как вы гарантируете, что они правильно настроены? Если вам нужно много параллелизма в приложении Winforms, лучше использовать асинхронные делегаты или пул потоков.
Если вы создаете фактические потоки, одним из распространенных способов реализации флага отмены является использование ManualResetEvent
. Если вы ждете этого события с нулевым таймаутом, он действует как флаг состояния потока. Пример использования будет:
ManualResetEvent cancelEvent = new ManualResetEvent(false);
for (int i = 0; i < 20; i++)
{
ThreadPool.QueueUserWorkItem(s =>
{
// Do some work
if (cancelEvent.WaitOne(0, true))
return;
// Do some more work
// etc.
});
}
Затем в какой-то момент позже, если вы пишете cancelEvent.Set()
, каждый работник прекратит свою работу, как только она попадает на проверку состояния.
У вас есть 20 фоновых резьб или использование его для других потоков – rerun