c# - 当无法到达取消 token 时,如何中止或终止 TPL 任务?

标签 c# task-parallel-library cancellation-token

让我们考虑一下这个方法:

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/

相关文章:

c# - 关于索引器和/或泛型的问题

c# - 不使用锁的并行 For 共享数组

c# - 当应用程序退出时,如何等待我的异步操作完成?

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

.net - CancellationToken.CanBeCanceled 什么时候可以为假?

c# - 如何在给定类名的情况下获取用户定义的对象类型?

c# - 使用 System.Windows.Automation 读出 Edge 浏览器标题和 URL

c# - 可视化开发工具

c# - WPF 异步等待任务锁定 UI 线程并行运行任务

c# - 如何使用 CancellationToken 属性?