我将后台任务添加到阻止集合(在后台添加).
我在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>.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。