Продолжение задачи TPL: задание в состоянии Сбой вместо отменено при отмене - PullRequest
0 голосов
/ 30 сентября 2019

При отмене следующей задачи задача не находится в состоянии Отменено, но Сбой:

    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. Может ли кто-нибудь помочь?

...