将CancellationToken与异步方法的任务相关联

时间:2013-03-06 20:29:38

标签: c# task-parallel-library async-await

问题:有没有办法将CancellationTokenTask方法返回的async相关联?

通常情况下,如果TaskOperationCancelledException匹配CancellationToken,则Task将以已取消状态结束CancellationToken。如果它们不匹配,则任务进入故障状态:

    void WrongCancellationTokenCausesFault()
    {
        var cts1 = new CancellationTokenSource();
        var cts2 = new CancellationTokenSource();
        cts2.Cancel();

        // This task will end up in the Faulted state due to the task's CancellationToken not matching the thrown 
        // OperationCanceledException's token.
        var task = Task.Run(() => cts2.Token.ThrowIfCancellationRequested(), cts1.Token);  
    }

使用async / await,我找不到设置方法Task的{​​{1}}的方法(从而实现相同的功能)。从我的测试来看,任何 CancellationToken似乎会导致OperationCancelledException方法进入已取消状态:

async

如果我的 async Task AsyncMethodWithCancellation(CancellationToken ct) { // If ct is cancelled, this will cause the returned Task to be in the Cancelled state ct.ThrowIfCancellationRequested(); await Task.Delay(1); // This will cause the returned Task to be in the Cancelled state var newCts = new CancellationTokenSource(); newCts.Cancel(); newCts.Token.ThrowIfCancellationRequested(); } 方法调用的方法被取消(并且我不希望取消 - 即不是async',那么更多控制会更好。 s Task),我希望任务进入故障状态 - 而不是取消状态。

1 个答案:

答案 0 :(得分:2)

我认为该设计适用于常见情况:如果取消任何子操作,则取消传播到父级(最常见的情况是父级和子级共享取消令牌)。

如果您需要不同的语义,可以在catch方法中OperationCanceledException async并抛出符合您所需语义的异常。如果您想重复使用这些语义,Task的扩展方法应该适合该法案。