问题:有没有办法将CancellationToken
与Task
方法返回的async
相关联?
通常情况下,如果Task
与OperationCancelledException
匹配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
),我希望任务进入故障状态 - 而不是取消状态。
答案 0 :(得分:2)
我认为该设计适用于常见情况:如果取消任何子操作,则取消传播到父级(最常见的情况是父级和子级共享取消令牌)。
如果您需要不同的语义,可以在catch
方法中OperationCanceledException
async
并抛出符合您所需语义的异常。如果您想重复使用这些语义,Task
的扩展方法应该适合该法案。