如何聚合多个任务结果

use*_*018 3 c# asynchronous task-parallel-library async-await

我在下面的代码 snipet 中创建了 2 个任务,现在我想将这两个任务结果合并到一个变量中:

public class DataPoint
{
    public int Id { get; set; }
    public string Data { get; set; }
}

public class Worker
{
    public void DoProcessing()
    {
        List<DataPoint> dp = new List<DataPoint>();

        Task task1 = Task.Factory.StartNew(() => Process1(dp));
        Task task2 = Task.Factory.StartNew(() => Process2(dp));

        Task.WhenAll(task1, task2);

        //var finalResult = task1 result + Task 2 results
    }

    private List<DataPoint> Process1(List<DataPoint> dp1)
    {
        return dp1;
    }
    private List<DataPoint> Process2(List<DataPoint> dp2)
    {
        return dp2;
    }
}
Run Code Online (Sandbox Code Playgroud)

Yuv*_*kov 5

如果你想加入这两个列表,你首先需要将你的方法标记为async Task,然后await Task.WhenAll为了异步等待两个任务完成:

public async Task DoProcessingAsync()
{
    var task1 = Task.Run(Process1);
    var task2 = Task.Run(Process2);

    var result = await Task.WhenAll(task1, task2);
    var finalResult = task1.Result.Concat(task2.Result).ToList();
}

private List<DataPoint> Process1()
{
    return new List<DataPoint>();
}

private List<DataPoint> Process2()
{
    return new List<DataPoint>();
}
Run Code Online (Sandbox Code Playgroud)

如果您使用.NET 4.5或以上,更喜欢Task.RunTask.Factory.StartNew

此外,List<T>不是线程安全的,不要传递由ProcessX任务中的方法返回的列表。使每个返回都是新鲜的,List<DataPoint>这样您就不会遇到线程问题。


Pet*_*eGO 5

await Task.WhenAll随着结果的汇总,这可以进一步简化:-

Task<int> t1 = Task.Factory.StartNew(() => { return 1; });
Task<int> t2 = Task.Factory.StartNew(() => { return 2; });

var result = await Task.WhenAll(t1, t2);

// result
// int[2] { 1, 2 }
Run Code Online (Sandbox Code Playgroud)