как продолжить остановку токена отмены?

У меня есть поток с этим кодом:

foreach (string file in allDirectoriesFiles)
{
    if (cancellationToken.IsCancellationRequested)
    {
        return;
    }

    // ... some operation...
}

// ... some operation 2...

обратите внимание, что я использую return вместо break, потому что, если я остановлю поток, some operation 2 не должен выполняться.

Я также замечаю, что таким образом .ContinueWith не выполняется.

Ну, но это всего лишь функция «возврата». Как C# может знать, что я возвращаюсь из-за tokenSource.Cancel() вместо обычного возврата?


person markzzz    schedule 21.04.2013    source источник


Ответы (2)


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

person Francois Nel    schedule 21.04.2013
comment
Что ж! Итак: если текущий поток выполняется, я могу только остановить его, проверяя токен отмены внутри него (на самом деле это не приведет к принудительному выходу из потока. Другими словами: он будет продолжаться до конца, если я не проверяю этот токен. Вместо этого, если функция продолжения не запущена, она не будет вызвана при вызове токена отмены (без проверки вручную). Верно? - person markzzz; 21.04.2013
comment
Да, это правильно. Даже «обычные» задачи не выполняются, если токен отмены (с которым он был создан) был отменен до того, как задача будет обработана планировщиком задач. Вы только проверяете токен в своей собственной задаче, чтобы вы могли отменить длительный цикл и т. д. O, и просто примечание: завершение задачи не обязательно означает выход потока (в котором выполняется ot), даже если исключение брошенный. - person Francois Nel; 21.04.2013

CancellationToken предназначен для распространения отмены на весь набор действий сразу. Как только вы Cancel() его источник, другие продолжения не будут называется.

person Efran Cobisi    schedule 21.04.2013