改进获取任务,因此没有多个枚举

Improve fetching tasks so there are no multiple enumerations

我有一个看起来像这样的事情:

var tasks = await _JobProvider.FetchPendingTasks();

    do
    {
      foreach (var task in tasks)
      {
        await ExecuteStep(task);
      }

      tasks = await _JobProvider.FetchPendingTasks();
    }
    while (tasks.Any());

我获取待处理任务,例如 returns 我在 IEnumerable 中获取一个任务。在 await ExecuteStep(task); 内可以生成更多任务。这就是我做第二个 tasks = await _JobProvider.FetchPendingTasks(); 的原因。有了它,我检查是否在 await ExecuteStep(task); 内生成了新任务,如果有,它会再次执行 do while 循环。这导致 tasks 的多重枚举,我认为可以改进。

有没有办法改进这段代码,不再有多重枚举?

您可以使用 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> 不会被多个线程同时访问。否则你可以使用 ConcurrentQueue<Task>.