为什么我的任务不启动 运行,除非我调用 Task.WhenAll()?
Why doesn't my Tasks start running unless I call Task.WhenAll()?
我有下面的代码。 (忽略 FindPhysicalPdfTicketAsync
的内部细节,内部包含 await/awaitable)
IEnumerable<Task> findPhysicalPdfTicketTasks = irTable.ToList().Select(row =>
{
return FindPhysicalPdfTicketAsync(row,
ticketListUserControl.physicalPdfTicketExistsStatus);
});
除非我在上述代码之后的一行中调用 Task.WhenAll(findPhysicalPdfTicketTasks)
或 await Task.WhenAll(findPhysicalPdfTicketTasks)
,否则枚举中的任务永远不会执行。
作为测试,我 运行 FindPhysicalPdfTicketAsync
方法独立于枚举之外,任务执行良好。
例如
IEnumerable<Task> test = irTable.First();
FindPhysicalPdfTicketAsync(test, ticketListUserControl.physicalPdfTicketExistsStatus);
那么,为什么可枚举的需要Task.WhenAll
?
更新: 在我发布跟进之前,我的问题已关闭:
那么Task.WhenAll(findPhysicalPdfTicketTasks)
触发枚举的原因是什么?我的理解是 WhenAll()
所做的就是等待所有“应该已经 运行” 的任务完成。
LINQ .Select()
创建一个 IEnumerable 对象。但是该对象 不会执行其主体语句 直到 您要求它为您提供结果。
要获得结果,并使其执行正文语句,您需要枚举 IEnumerable。这可以通过多种方式完成,例如:
var taskList = findPhysicalPdfTicketTasks.ToList();
或
var taskArray = findPhysicalPdfTicketTasks.ToArray();
或
foreach (var task in findPhysicalPdfTicketTasks)
{
// ...
}
或(就像你已经做的那样):
await Task.WhenAll(findPhysicalPdfTicketTasks);
我有下面的代码。 (忽略 FindPhysicalPdfTicketAsync
的内部细节,内部包含 await/awaitable)
IEnumerable<Task> findPhysicalPdfTicketTasks = irTable.ToList().Select(row =>
{
return FindPhysicalPdfTicketAsync(row,
ticketListUserControl.physicalPdfTicketExistsStatus);
});
除非我在上述代码之后的一行中调用 Task.WhenAll(findPhysicalPdfTicketTasks)
或 await Task.WhenAll(findPhysicalPdfTicketTasks)
,否则枚举中的任务永远不会执行。
作为测试,我 运行 FindPhysicalPdfTicketAsync
方法独立于枚举之外,任务执行良好。
例如
IEnumerable<Task> test = irTable.First();
FindPhysicalPdfTicketAsync(test, ticketListUserControl.physicalPdfTicketExistsStatus);
那么,为什么可枚举的需要Task.WhenAll
?
更新: 在我发布跟进之前,我的问题已关闭:
那么Task.WhenAll(findPhysicalPdfTicketTasks)
触发枚举的原因是什么?我的理解是 WhenAll()
所做的就是等待所有“应该已经 运行” 的任务完成。
LINQ .Select()
创建一个 IEnumerable 对象。但是该对象 不会执行其主体语句 直到 您要求它为您提供结果。
要获得结果,并使其执行正文语句,您需要枚举 IEnumerable。这可以通过多种方式完成,例如:
var taskList = findPhysicalPdfTicketTasks.ToList();
或
var taskArray = findPhysicalPdfTicketTasks.ToArray();
或
foreach (var task in findPhysicalPdfTicketTasks)
{
// ...
}
或(就像你已经做的那样):
await Task.WhenAll(findPhysicalPdfTicketTasks);