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

问题描述 投票:0回答:1

我正在做一个看起来像这样的事情:

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的多个枚举,我认为可以改进。

是否有改进此代码的方法,所以不再有多个枚举?

c# async-await ienumerable enumeration
1个回答
1
投票

您可以使用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>

© www.soinside.com 2019 - 2024. All rights reserved.