让我们考虑一下这个方法:
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();
以及项目的例子:
IEnumerable Items
{
get
{
yield return 0;
Task.Delay(Timeout.InfiniteTimeSpan).Wait();
yield return 1;
}
}
任务呢。等等? 我无法将我的取消 token 放入项目集合中。
如何终止没有响应的任务或解决这个问题?
最佳答案
我找到了一种解决方案,允许将取消 token 放入来自第三方的项目中:
public static IEnumerable<T> ToCancellable<T>(this IEnumerable<T> @this, CancellationToken token)
{
var enumerator = @this.GetEnumerator();
for (; ; )
{
var task = Task.Run(() => enumerator.MoveNext(), token);
task.Wait(token);
if (!task.Result)
yield break;
yield return enumerator.Current;
}
}
现在我需要使用:
Items.ToCancellable(cts.token)
取消请求后不会挂起。
关于c# - 当无法到达取消 token 时,如何中止或终止 TPL 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18103383/