如何一次 运行 多项任务并将 return 值添加到列表中?

How to run mutliple tasks at once and add return values to a list?

一次 运行 多个 tasks 并将它们的 return 值添加到 c sharp 列表中的最简单方法是什么? 我尝试了几种方法,但我可能做错了所有事情,因此我在这里没有太多代码 post。

更新:

这是我失败的尝试之一。我基本上是想从 link 中获取 JSON 字典(每个任务的 links 都会不同)并将所有 JSON 字典添加到单个列表中结尾。但是我希望所有任务同时运行。

static class Program
{
    static void Main()
    {
        List<dynamic> writeList = new List<dynamic>();
        for (int i = 0; i <= 50; i++)
        {
            Task<dynamic> task = Task<dynamic>.Factory.StartNew(
                () => savePageData("www.someJsonlink.com"));
            writeList.Add(task);
        }
    }

    static dynamic savePageData(string url)
    {
        WebClient client = new WebClient();
        string page = client.DownloadString(url);
        var data = JsonConvert.DeserializeObject(page);
        return data;

    }
}

这种方法的问题是没有任何东西被添加到列表中。实际上也没有与 link 建立联系。但是当正常完成时,数据是存在的。

最简单的方法可能是使用Select LINQ operator, combined with the Task.WhenAll方法:

int[] ids = GetIds();
Task<Image>[] tasks = ids.Select(id => DownloadImageAsync(id)).ToArray();
Image[] results = await Task.WhenAll(tasks);

在此示例中,Select 运算符将每个 int 投影到 Task<Image>,从而产生 IEnumerable<Image> 序列。使用 ToArray LINQ 运算符将此序列具体化为 Task<Image> 的数组。

如果您为每个图像调用的方法不是异步的,那么您可以这样代替 .Select(id => DownloadImageAsync(id)).Select(id => Task.Run(() => DownloadImage(id)))。这样,将使用 ThreadPool 个线程并行调用多个 DownloadImage。池中的线程数量是有限的,因此您很可能无法获得与真正的异步 DownloadImageAsync 调用相同程度的并行性。