gpt4 book ai didi

c# - 任务取消,什么时候?

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

对于我正在制作的 API 的实现,我希望用户能够取消他们的任务 (Task)。我发现我需要一个 CancellationTokenSource,这样我就可以从前者创建一个 CancellationToken。现在我正在处理取消请求 (IsCancellationRequested/ThrowIfCancellationRequested),我有点困惑。检查/执行此操作的适当时间是什么时候?

例如(虚构的):

async Task<int> DoStuff(int number, CancellationToken token) {
// 1. Here, callee-site?
token.ThrowIfCancellationRequested();

var resultTask1 = _database.GetSomeDataFromDatabase(token); // 2. Inside this method?
var resultTask2 = _service.SomeRestCall(token); // 2. Inside this?

// 3. Here, before the tasks return?
token.ThrowIfCancellationRequested();
var result1 = await resultTask1;
var result2 = await resultTask2;

// 4. In memory processing, here?
foreach(var item in result1)
{
// ...
}

foreach(var item in result2)
{
// 1. Here?
token.ThrowIfCancellationRequested();
await _fileSystem.Save(fileName, item, token); // 5. Inside this?
}

// 6. Here probably doesn't make sense though, the result is already retrieved?
return 123;
}

什么是取消任务的最佳做法?

最佳答案

What would be the proper time to check/do this?

对于 CPU 绑定(bind)方法,定期调用 CancellationToken.ThrowIfCancellationRequested 是合适的。例如,如果您有一个紧密的处理循环,您可能希望每隔几百次迭代左右调用一次。

但是,听起来您的情况完全受 I/O 限制(自然是异步的)。在这种情况下,最好只向下传递 token 。更高级别的异步方法可以只传递 token 。在最低级别,如果 API 不直接支持 CancellationToken,那么通常最好使用 CancellationToken.Register 来实现异步操作的真正取消。当然,如果最底层的API直接支持CancellationToken,直接传过去就行了。

关于c# - 任务取消,什么时候?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34297455/

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