为什么我的任务不启动 运行,除非我调用 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);