我使用Tasks来执行计算密集型操作。 PerformCalculation 方法。主要父任务使用任务工厂创建三个子任务并开始执行。每个子任务都应返回
一个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);
});
答案 0 :(得分:0)
我会稍微提出一个问题,因为所有这些API基本上已经过时(或者至少不适合主流&#34;场景)。这实际上相当容易:
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
是一种相当深奥的类型,我从未见过在野外使用过。应该避免附加的子任务,因为它们添加了非明显的依赖项。这些都不是错误,但它们都有气味。