如何确保所有任务都已执行并查询最终结果
本文关键字:执行 查询 结果 任务 何确保 确保 | 更新日期: 2023-09-27 18:35:36
我正在使用任务来执行计算密集型操作。执行计算方法。主父任务使用任务工厂创建三个子任务并开始执行。每个子任务应返回一List<Dictionary<int,double>>
List<double> paramList = new List<double>{ 2, 2.5, 3};
CancellationTokenSource cts = new CancellationTokenSource();
Task parent = new Task(() =>
{
var tf = new TaskFactory<List<Dictionary<int, double>>>(cts.Token, TaskCreationOptions.AttachedToParent,
TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
var childTasks = new[] {
tf.StartNew(() => PerformCalculation(cts.Token, paramList[0],Task.CurrentId)),
tf.StartNew(() => PerformCalculation(cts.Token, paramList[1],Task.CurrentId)),
tf.StartNew(() => PerformCalculation(cts.Token, paramList[2],Task.CurrentId)) //3rd entry
};
成功执行后子任务的结果应采用List<Dictionary<int, double>>
的形式。
现在我的要求是编写一个 lambda 表达式,该表达式将在所有子任务完成执行并填充到另一个列表中后查询所有子任务的结果
即列表列表 ( List<List<Dictionary<int, double>>>
)
// When all children are done, get the value returned from the
// non-faulting/canceled tasks.
tf.ContinueWhenAll(childTasks, completedTasks =>
completedTasks
.Where(t => t.Status == TaskStatus.RanToCompletion)**??Need HELP HERE ???**),CancellationToken.None)
,TaskContinuationOptions.ExecuteSynchronously);
});
我会稍微
回避这个问题,因为所有这些 API 基本上都已经过时了(或者至少不适合"主流"场景)。这实际上相当容易:
var childTasks = new[] {
Task.Run(() => PerformCalculation(cts.Token, paramList[0],Task.CurrentId)),
Task.Run(() => PerformCalculation(cts.Token, paramList[1],Task.CurrentId)),
Task.Run(() => PerformCalculation(cts.Token, paramList[2],Task.CurrentId)),
};
var results = Task.WhenAll(childTasks).Result;
TaskFactory
是一种相当深奥的类型,我从未见过在野外使用过。应避免附加的子任务,因为它们会添加不明显的依赖项。这些都不是错误,但它们是气味。