我正在做一个看起来像这样的事情:
var tasks = await _JobProvider.FetchPendingTasks();
do
{
foreach (var task in tasks)
{
await ExecuteStep(task);
}
tasks = await _JobProvider.FetchPendingTasks();
}
while (tasks.Any());
我获取待处理的任务,例如,它在IEnumerable
中返回了一个任务。在await ExecuteStep(task);
内部可以生成更多任务。这就是为什么我要进行第二次tasks = await _JobProvider.FetchPendingTasks();
。有了它,我检查await ExecuteStep(task);
内部是否生成了新任务,如果有,它将再次执行do while
循环。这会导致tasks
的多个枚举,我认为可以改进。
是否有改进此代码的方法,所以不再有多个枚举?
您可以使用Queue<Task>
,并用Queue<Task>
循环而不是while
进行无休止的枚举:
foreach
这假设var queue = new Queue<Task>(await _JobProvider.FetchPendingTasks());
while (queue.Count > 0)
{
var task = queue.Dequeue();
Task[] moreTasks = await ExecuteStep(task);
foreach (var t in moreTasks) queue.Enqueue(t);
}
不会被多个线程同时访问。否则,您可以使用Queue<Task>
。