如何默认初始化Task<T> 实现未赋值任务可参与Task.WhenAll统一等待
解法1:初始化时指定已完成的默认Task
你只需要在声明变量时直接给它赋值一个已完成的默认Task实例即可,条件满足时再替换为真实的异步任务,完全不会影响后续统一执行Task.WhenAll:
// 初始化时直接赋值已完成的默认Task,可根据业务需要调整默认返回值,比如空字符串"" Task<string> ownerTask = Task.FromResult<string>(default); if(fields.Select(x => x.Name == "owner").Any()) { ownerTask = _repo.GetOwnerIdFromIssueId(issueId); } await Task.WhenAll(ownerTask, anothertask, anothertask, etc);
注意事项
- 如果是无返回值的非泛型
Task,直接用框架内置的Task.CompletedTask作为默认值即可,这是全局单例的已完成任务,性能开销极低。 - 默认返回值可根据业务需求自定义,不需要强制用
default,比如你需要默认返回空字符串,直接写Task.FromResult("")即可。
解法2:用List收集待执行任务(更适合多条件任务场景)
如果你有大量需要条件判断的异步任务,可以统一用List<Task>收集需要执行的任务,最后统一传入Task.WhenAll,不需要额外处理默认任务:
var taskList = new List<Task>(); // 先添加所有固定要执行的任务 taskList.Add(anothertask1); taskList.Add(anothertask2); // 条件满足时才添加对应的任务 if(fields.Select(x => x.Name == "owner").Any()) { taskList.Add(_repo.GetOwnerIdFromIssueId(issueId)); } await Task.WhenAll(taskList);
这种方案不需要为每个条件任务声明单独的变量,也不需要处理默认值,代码更简洁,适合任务数量多、条件判断多的场景。
内容的提问来源于stack exchange,提问作者jhammond
相关产品推荐
相关产品推荐

