c# - 除非我调用 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()
所做的只是等待所有“据说已经在运行”的任务完成。
解决方案
LINQ.Select()
创建一个 IEnumerable 对象。但是,在您要求它为您提供结果之前,该对象不会执行其主体语句。
要获得结果并使其执行主体语句,您需要枚举IEnumerable。这可以通过多种方式完成,例如:
var taskList = findPhysicalPdfTicketTasks.ToList();
或者
var taskArray = findPhysicalPdfTicketTasks.ToArray();
或者
foreach (var task in findPhysicalPdfTicketTasks)
{
// ...
}
或者(就像你已经做过的那样):
await Task.WhenAll(findPhysicalPdfTicketTasks);
推荐阅读
- facebook - Facebook令牌通过公共页面刮
- javascript - 如何在 JavaScript 中映射两个不同长度的对象数组的属性
- php - 将数据移动到 Laravel 中的另一个表
- google-apps-script - 仅当同时登录多个 G-Mail 帐户时才会出现 X-Frame-Options 问题
- javascript - 如何从输入中复制文本
- javascript - Svelte:在父母和孩子之间转移道具
- postgresql - 将 client_min_messages 设置为特定角色 postgres
- swift - 未触发 NSTableView 的项目选择事件
- javascript - 反应原生传递 route.params 以获取请求
- javascript - 为什么这个 d3.js 散点图上没有呈现标签/文本?