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

本文关键字:项目 返回 结果 获取 并行 | 更新日期: 2023-09-27 18:25:05

我有一些代码看起来与此类似:

    public IList<Result> GetResult()
    {
        var result = new List<Result>();
        result.AddRange(GetSomeItemsA());
        result.AddRange(GetSomeItemsB());
        result.AddRange(GetSomeItemsC());
        return result;
    }

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

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

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

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

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

我做了如下操作:

        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;