改进获取任务,因此没有多个枚举
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>
.
我有一个看起来像这样的事情:
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>
.