加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用Task.WhenAll和BlockingCollection生成的无限任务

发布时间:2020-12-15 04:05:51 所属栏目:百科 来源:网络整理
导读:我将后台任务添加到阻止集合(在后台添加). 我在GetConsumingEnumerable返回的Enumerable上等待Task.WhenAll. 我的问题是:Task.WhenAll的重载是否接收到IEnumerable“准备好”可能会收到无穷无尽的任务? 我只是不确定我是否可以这样做,或者它是否意味着以这
我将后台任务添加到阻止集合(在后台添加).

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

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

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

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));
    }
}

解决方法

Task.WhenAll不能处理无数个任务.它将首先(同步)等待枚举完成,然后(异步)等待它们全部完成.

如果要以异步方式对序列作出反应,则需要使用IObservable< Task> (反应性扩展).您可以将TPL Dataflow BufferBlock用作可以使用同步或异步代码的“队列”,并且可以轻松转换为IObservable< Task>.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读