Улучшить выборку задач, чтобы не было нескольких перечислений - PullRequest
0 голосов
/ 30 октября 2019

У меня есть время, которое выглядит следующим образом:

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, которое, я думаю, могло бы быть улучшено.

Есть ли способ улучшить этот код, чтобы больше не было множественных перечислений?

1 Ответ

1 голос
/ 30 октября 2019

Вы можете использовать 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>.

...