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

标签 c# .net multithreading parallel-processing task

<分区>

我需要获取多个Task<List<string>>的返回值并行执行并将它们合并到一个新的 List<string> 中.

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

fiddle :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",
        };
    }
}

最佳答案

您可以尝试使用 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>>();

关于c# - 使用 Task.WaitAll() 时如何获取任务的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34797998/

相关文章:

.net - 是否有 .net 框架可以帮助解决这种情况?

c++ - OpenMP 优化 for 循环的调度

python - 在 Python 中同时在控制台中打印 2 行

multithreading - 调用performSelectorInBackground : from background thread

c# - 为什么不是 C# 的 memberinfo() 反射函数

c# - TabControl - ToggleButtons 作为 TabSelector(仅 XAML 逻辑)

c# - NetMQ 中 RouterSocket 上的轮询器

c# - 使用 BouncyCaSTLe c# 进行 PgP 加密和解密

c# - C# 中完整的老式 TUI 命令行应用程序

.net - 手机上的 MVC4 BrowserOverride.Desktop 问题