首页 > 解决方案 > 除非我调用 Task.WhenAll(),否则为什么我的任务不会开始运行?

问题描述

我有下面的代码。(忽略内部细节FindPhysicalPdfTicketAsync,内部包含等待/等待)

IEnumerable<Task> findPhysicalPdfTicketTasks = irTable.ToList().Select(row =>
{
    return FindPhysicalPdfTicketAsync(row,
        ticketListUserControl.physicalPdfTicketExistsStatus);
});

除非我在上面的代码之后调用Task.WhenAll(findPhysicalPdfTicketTasks)or ,否则await Task.WhenAll(findPhysicalPdfTicketTasks)枚举中的任务永远不会执行。

作为测试,我在FindPhysicalPdfTicketAsync枚举之外独立运行了该方法,并且 Task 执行得很好。

例如

IEnumerable<Task> test = irTable.First();

FindPhysicalPdfTicketAsync(test, ticketListUserControl.physicalPdfTicketExistsStatus);

那么,为什么需要枚举Task.WhenAll呢?


更新:在我发布跟进之前,我的问题已经结束:

那么Task.WhenAll(findPhysicalPdfTicketTasks)触发枚举的原因是什么?我的理解是,WhenAll()所做的只是等待所有“据说已经在运行”的任务完成。

标签: c#multithreadingasynchronousasync-awaittask-parallel-library

解决方案


LINQ.Select()创建一个 IEnumerable 对象。但是,在您要求它为您提供结果之前,该对象不会执行其主体语句。

要获得结果并使其执行主体语句,您需要枚举IEnumerable。这可以通过多种方式完成,例如:

var taskList = findPhysicalPdfTicketTasks.ToList();

或者

var taskArray = findPhysicalPdfTicketTasks.ToArray();

或者

foreach (var task in findPhysicalPdfTicketTasks)
{
    // ...
}

或者(就像你已经做过的那样):

await Task.WhenAll(findPhysicalPdfTicketTasks);

推荐阅读