При отмене следующей задачи задача не находится в состоянии Отменено, но Сбой:
private string ReturnString()
{
// throw new OperationCanceledException(_cancellationToken); // This puts task in faulted, not canceled
Task.Delay(5000, _cancellationToken).Wait(_cancellationToken); // Simulate work (with IO-bound call)
// throw new OperationCanceledException(_cancellationToken); // This puts task in faulted, not canceled
// _cancellationToken.ThrowIfCancellationRequested(); // This puts task in faulted, not canceled
// throw new Exception("Throwing this exception works!"); // This works as expected (faulted)
return "Ready";
}
private void SetReturnValueWithTaskContinuation()
{
SynchronizationContext synchronizationContext = SynchronizationContext.Current;
Task<string> task = Task.Run(() => ReturnString());
task.ContinueWith(
antecedent =>
{
if (antecedent.Status == TaskStatus.Canceled)
{
synchronizationContext.Post(result => _txtResultContinueWith.Text = (string)result, "Cancelled");
}
else if (antecedent.Status == TaskStatus.Faulted)
{
synchronizationContext.Post(result => _txtResultContinueWith.Text = (string)result, "Exception");
}
else
{
synchronizationContext.Post(result => _txtResultContinueWith.Text = (string)result, antecedent.Result);
}
});
}
Я знаю, что маркер отмены должен быть предоставлен при создании исключения OperationCanceled. Я знаю, что есть два способа вызвать исключение OperationCanceled, где ThrowIfCancellationRequested () является предпочтительным. И я знаю, что токен отмены цепочки продолжения должен отличаться от токена отмены задачи, которую нужно отменить, в противном случае цепочка продолжения также будет отменена. Для упрощения я использую только один токен отмены, чтобы отменить саму задачу. Но задача имеет состояние «Не выполнено», а не «Отменено». Это ошибка? Если нет, то это проблема удобства использования TPL. Может ли кто-нибудь помочь?