gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:07:28 25 4
gpt4 key购买 nike

问题:有没有办法关联一个CancellationTokenTaskasync 返回方法?

通常,一个 Task最终会出现在 Canceled说明 OperationCancelledException被抛出 CancellationToken匹配 TaskCancellationToken .如果它们不匹配,则任务进入 Faulted状态:

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 ,我还没有找到一种方法来设置方法的 TaskCancellationToken (从而实现相同类型的功能)。从我的测试来看,似乎任何 OperationCancelledException将导致 async进入Canceled状态的方法:

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 调用一个方法方法被取消(我不希望取消——即它不是这个 TaskCancellationToken ),我希望任务进入 Faulted状态——不是 Canceled状态。

最佳答案

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

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

关于c# - 将 CancellationToken 与异步方法的任务相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15257356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com