【发布时间】:2014-04-03 17:20:57
【问题描述】:
让我们考虑方法:
Task Foo(IEnumerable items, CancellationToken token)
{
return Task.Run(() =>
{
foreach (var i in items)
token.ThrowIfCancellationRequested();
}, token);
}
那么我有一个消费者:
var cts = new CancellationTokenSource();
var task = Foo(Items, cts.token);
task.Wait();
还有Items的例子:
IEnumerable Items
{
get
{
yield return 0;
Task.Delay(Timeout.InfiniteTimeSpan).Wait();
yield return 1;
}
}
task.Wait 呢? 我无法将我的取消令牌放入项目集合中。
如何杀死没有响应的任务或解决这个问题?
【问题讨论】:
-
为什么不能将令牌传递给 Items()?
-
@DaxFohl 我把它们作为论据。在我的问题中,这些项目只是对外面发生的事情的可视化。
-
你能把 cts 设为成员变量并从
Items那样使用它吗? -
@DaxFohl:不幸的是没有。我不能对项目做任何事情。只需遍历它们。
-
您无法取消不可取消的操作,但您可以停止等待。您想要什么,停止等待或取消 Items 的迭代?
标签: c# task-parallel-library cancellation-token