如何确保所有任务都已执行并查询最终结果

时间:2016-02-22 10:10:19

标签: c# .net lambda .net-4.0 task

我使用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);

});

1 个答案:

答案 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是一种相当深奥的类型,我从未见过在野外使用过。应该避免附加的子任务,因为它们添加了非明显的依赖项。这些都不是错误,但它们都有气味。