Если я вызываю cancellationTokenSource.Cancel
в задаче, связанной с токеном отмены, OperationCancelledException
выдается правильно, однако task.IsCanceled
НЕ всегда обновляется и устанавливается на true
, как можно было бы ожидать.
Проблему можно быстро продемонстрировать с помощью следующего теста nUnit:
var cancellationTokenSource = new CancellationTokenSource();
Task task = Task.Factory.StartNew(() =>
{
cancellationTokenSource.Cancel();
cancellationTokenSource.Token.ThrowIfCancellationRequested();
},
cancellationTokenSource.Token);
try
{
task.Wait(cancellationTokenSource.Token);
}
catch (OperationCanceledException)
{
}
if (task.IsCanceled)
{
Assert.Pass();
}
else
{
Assert.Fail();
}
Когда я запускаю этот тест, тест проходит, однако, когда я отлаживаю этот тест (используя средство запуска тестов Resharper), тест завершается ошибкой.
Я не думаю, что это имеет какое-либо отношение к Resharper, я думаю, что Resharper просто может создавать некоторые условия, которые, возможно, выявляют проблему в .Net. Или, может быть, я просто делаю что-то совершенно неправильно... Есть идеи?
Cancel
вызывается? - person Jon Skeet   schedule 13.01.2015cancellationTokenSource.IsCancellationRequested
устанавливается наtrue
, ноtask.IsCanceled
по-прежнему устанавливается наfalse
. Это сбивает с толку. - person Mikeyg36   schedule 13.01.2015task.Status
? - person Jon Skeet   schedule 13.01.2015StartNew
и используете его только в теле. - person Servy   schedule 13.01.2015Console.WriteLine("task.Status: {0}", task.Status);
прямо перед блоком if, тест пройден. Но если я удалю этот вызов, тест завершится неудачно. - person Mikeyg36   schedule 13.01.2015Assert.Fail
и проверил task.Status в отладчике. он установлен на «Работает». - person Mikeyg36   schedule 13.01.2015