Это наиболее вероятно, потому что у вас либо нет метода отмены, либо внутри DoWork()
есть подпроцессы, которые все еще работают, когда вы вызываете Cancel()
.Как сказал @Damien_The_Unbeliever, отмена - это совместная задача.
Когда вы вызываете _cancelTokenSource.Cancel()
, если вы не зарегистрировали функцию обратного вызова, все, что происходит, это то, что булево значение isCancellationRequested
установлено в true, DoWork()
Метод отвечает за то, чтобы увидеть это и остановить его выполнение самостоятельно.Однако здесь есть недостаток, который, как вы, вероятно, можете сказать, заключается в том, что если в задаче DoWork()
при вызове Cancel()
выполняется трудоемкий цикл, этот цикл должен завершить итерацию, прежде чем сможет проверить значение.isCancellationRequested
, что может привести к зависанию.
Способ обойти это - вставить функции обратного вызова отмены в метод DoWork()
, см. здесь и затем зарегистрировать их в токене, так чточто при вызове метода Cancel()
ВСЕ задачи, работающие в фоновом режиме, останавливаются без ожидания их.
Надеюсь, это поможет!