【发布时间】:2014-08-26 21:22:20
【问题描述】:
我正在将后台任务添加到阻塞集合(在后台添加)。
我正在等待 GetConsumingEnumerable 返回的 Enumerable 上的 Task.WhenAll。
我的问题是:接收 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));
}
}
【问题讨论】:
-
似乎使用
Parallel.Foreach(Repository.GetAllJobs,....)会是一个更简单的解决方案。 -
Task.WhenAll将阻塞调用线程直到GetConsumingEnumerable完成 -
好吧,如果有无数的任务,他们永远不会全部完成,因为你永远不会得到整套。
-
@SriramSakthivel GetConsumingEnumerable 立即返回一个 IEnumerable 但仅在数据可用时才进行迭代......预期的行为
-
@rudimenter 在你回复之前我编辑了我的评论。看看这是否有意义?
标签: c# task async-await blockingcollection