У меня есть вопрос относительно отмены задачи с использованием cancellationToken и cancellationTokenSource:
Обычный способ выглядит следующим образом:
var cts = new CancellationTokenSource();
var t = Task.Run(() => {
while(true)
{
if (!cts.IsCancellationRequested)
{ //do stuff }
}
}, cts.Token);
Итак, цикл while продолжается до тех пор, пока не будет запрошен токен.
Сегодня, изучая метод Cancel()
, я обнаружил, что вы можете использовать метод Register()
для определения другого кода, запускаемого при запросе токена, поэтому мне было интересно, что если кто-то напишет что-то вроде этого:
var cts = new CancellationTokenSouce();
token=cts.Token;
token.Register(
() => {
//do something to manage the cancel call
return;
};
)
var t = Task.Run(() => {
//do stuff
}, cts.Token);
При этом задача, связанная с CancellationToken
, сразу же перестает выполняться, вместо того, чтобы завершать текущий для итерации, как в обычной реализации. Мой вопрос: это правильный способ немедленно остановить Task
или есть лучший способ?