我正在将后台任务添加到阻塞集合中(在后台中添加)。
我使用由GetConsumingEnumerable返回的可枚举对象上的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,....)
将是一个更简单的解决方案。 - L.BWhenAll
,只需等待取消令牌即可。 - Servy