バックグラウンド タスクをブロッキング コレクション (バックグラウンドで追加) に追加しています。
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));
}
}