使用Task.WaitAll()时如何获取任务的返回值

时间:2016-01-14 19:25:25

标签: c# .net multithreading parallel-processing task

我需要获得并行执行的多个Task<List<string>>的返回值,并将它们合并为一个新的List<string>

这就是我目前所拥有的。正如您在小提琴中看到的那样,任务正在并行执行(执行时间约为1秒)。问题是不知道如何从每次执行中获取返回值(List<string>对象),因此我可以合并它们。

小提琴:https://dotnetfiddle.net/91YqkY

代码:

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var filters = new List<string>
        {
            "A", "B", "C"
        }

        ;
        var api = new API();
        var TaskList = new List<Task>();
        foreach (var f in filters)
        {
            var LastTask = new Task<List<String>>(() =>
            {
                return api.GetArray(f);
            }

            );
            LastTask.Start();
            TaskList.Add(LastTask);
        }

        Task.WaitAll(TaskList.ToArray());
        foreach (var t in TaskList)
        {
            // I need to get the List<string> returned in each GetArray and merge them
        }
    }
}

public class API
{
    public List<string> GetArray(string param)
    {
        Thread.Sleep(1000);
        return new List<String>{
            param + "1",
            param + "2",
            param + "3",
        };
    }
}

1 个答案:

答案 0 :(得分:5)

您可以尝试使用SelectMany方法:

var result = TaskList.Select(t => t.Result)
                     .SelectMany(r => r)
                     .ToList();

最初,您将TaskList的每个元素(一个TaskList<string>对象)投影到它的结果,在您的情况下为List<string>,然后使用SelectMany方法您可以在任务结果中定义所有字符串的序列。最后但同样重要的是,您必须调用ToList,以便执行查询并获得List<string>的结果。

<强>更新

正如谢尔盖在下面的评论中正确指出的那样,你必须重新定义你的TaskList

var TaskList = new List<Task<List<string>>();