c# - 使用 Task.WhenAll 与 BlockingCollection 产生的无限任务

标签 c# task async-await blockingcollection

我正在将后台任务添加到阻塞集合(在后台添加)。

我正在等待 Task.WhenAll 在 GetConsumingEnumerable 返回的 Enumerable 上。

我的问题是:接收 IEnumerable 的 Task.WhenAll 的重载是否“准备好”可能接收无穷无尽的任务?

我只是不确定我是否可以这样做,或者它是否应该以这种方式使用?

private async Task RunAsync(TimeSpan delay, CancellationToken cancellationToken)
{
    using (BlockingCollection<Task> jobcollection = new BlockingCollection<Task>())
    {
        Task addingTask = Task.Run(async () =>
        {
            while (true)
            {
                DateTime utcNow = DateTime.UtcNow;
                var jobs = Repository.GetAllJobs();
                foreach (var job in GetRootJobsDue(jobs, utcNow))
                {
                    jobcollection.Add(Task.Run(() => RunJob(job, jobs, cancellationToken, utcNow), cancellationToken), cancellationToken);
                }

                await Task.Delay(delay, cancellationToken);
            }
        }, cancellationToken);

        await Task.WhenAll(jobcollection.GetConsumingEnumerable(cancellationToken));
    }
}

最佳答案

Since your goal is merely to wait until the cancellation token is cancelled ,你应该那个。由于其他人已经解释过的原因,在无限的任务序列上使用 WhenAll 并不是解决这个问题的方法。有更简单的方法来完成永远不会完成的任务。

await new TaskCompletionSource<bool>().Task
    .ContinueWith(t => { }, cancellationToken);

关于c# - 使用 Task.WhenAll 与 BlockingCollection 产生的无限任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25488574/

相关文章:

c# - 使用 C# 以千位逗号分隔符格式化数字

c# - 什么时候应该在 C# 4.0 中使用动态关键字?

c# - 为什么不等待我传递给 Task.Run() 的异步操作?

javascript - javascript音频对象-.ogg blob中存在的音频播放器

c# - 如何取消await Task.Delay()?

c# - 如何以编程方式在 C# 中创建字符串?

c# - 从泛型类型参数获取类的静态属性

c# - 多个调用等待同一个异步任务

c# - 任务未处理的异常

async-await - 在特定线程中运行异步函数