使用 Task.WaitAll() 时如何获取任务的 return 值
How to get return value of tasks when using Task.WaitAll()
我需要获取并行执行的多个Task<List<string>>
的return值,并将它们合并成一个新的List<string>
。
这是我目前拥有的。正如您在 fiddle 中看到的,任务正在并行执行(执行时间约为 1 秒)。问题是不知道如何从每次执行中获取 returned 值(一个 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
的每个元素投影到它的结果,在你的情况下是 List<string>
然后使用 SelectMany
方法定义任务结果中所有字符串的序列。最后但并非最不重要的一点是,您必须调用 ToList
,以便执行查询并获得结果 List<string>
.
更新
正如谢尔盖在下面的评论中正确指出的那样,您必须重新定义您的 TaskList
。
var TaskList = new List<Task<List<string>>();
我需要获取并行执行的多个Task<List<string>>
的return值,并将它们合并成一个新的List<string>
。
这是我目前拥有的。正如您在 fiddle 中看到的,任务正在并行执行(执行时间约为 1 秒)。问题是不知道如何从每次执行中获取 returned 值(一个 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
的每个元素投影到它的结果,在你的情况下是 List<string>
然后使用 SelectMany
方法定义任务结果中所有字符串的序列。最后但并非最不重要的一点是,您必须调用 ToList
,以便执行查询并获得结果 List<string>
.
更新
正如谢尔盖在下面的评论中正确指出的那样,您必须重新定义您的 TaskList
。
var TaskList = new List<Task<List<string>>();