【发布时间】:2015-12-15 19:10:32
【问题描述】:
对于我正在制作的 API 的实现,我希望用户能够取消他们的任务(任务)。我发现我需要一个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;
}
取消任务的最佳做法是什么?
【问题讨论】:
-
我认为如果任务很小,您可以在返回之前进行取消检查。如果任务很长,您可以放在多个位置(如果取消,请注意回滚)。最后,如果有一个长循环,你可以把取消检查放在循环内。这只是我的意见。更聪明的人可能会有一个合理和更好的答案。
-
@displayName:为什么?那只是一种错觉。一切都已保存。
-
@jgauffin:尽管我明确表示这是我的观点并且人们可能更聪明,但我仍然有人质疑我我的拙见。 :) 无论如何.. 我更新的评论更好吗?
-
@displayName:我不是故意冒犯你的。 a) 我只是想为 OP 指出它 b) 还想看看我是否遗漏了什么
-
@jgauffin: 1) 没有冒犯。 2)感谢您,我们有更好的评论和更好的答案。
标签: c# .net task-parallel-library