并行获取不同来源的项目并返回结果

时间:2013-07-26 09:38:15

标签: c# .net optimization task-parallel-library

我有一些类似于此的代码:

    public IList<Result> GetResult()
    {
        var result = new List<Result>();

        result.AddRange(GetSomeItemsA());
        result.AddRange(GetSomeItemsB());
        result.AddRange(GetSomeItemsC());

        return result;
    }

我想使用任务并行库调用方法GetSomeItemsA,GetSomeItemsB和GetSomeItemsC,或者以其他方式使其更快,然后仅在完成三个任务时返回结果。

一般来说,什么是最好的方法,当我们需要从不同来源获取项目然后返回包含来自这些来源的所有项目的结果时,如何优化它?

2 个答案:

答案 0 :(得分:1)

您可以使用PLINQ执行此操作:

public IList<Result> GetResult()
{
    return new Func<IEnumerable<Result>>[] { GetSomeItemsA, GetSomeItemsB, GetSomeItemsC  }
        .AsParallel()
        .SelectMany(f => f())
        .ToList();
}

答案 1 :(得分:0)

我做了类似以下的事情:

        var result = new List<Result>();

        var firstTask = new Task<IEnumerable<Result>>(this.GetSomeItemsA);
        var secondTask = new Task<IEnumerable<Result>>(this.GetSomeItemsB);
        var thirdTask = new Task<IEnumerable<Result>>(this.GetSomeItemsC);
        firstTask.Start();
        secondTask.Start();
        thirdTask.Start();

        Task.WaitAll(firstTask, secondTask, thirdTask);

        result.AddRange(firstTask.Result);
        result.AddRange(secondTask.Result);
        result.AddRange(thirdTask.Result);

        return result;