Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Task.WaitAll()时如何获取任务的返回值_C#_.net_Multithreading_Parallel Processing_Task - Fatal编程技术网

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

C# 使用Task.WaitAll()时如何获取任务的返回值,c#,.net,multithreading,parallel-processing,task,C#,.net,Multithreading,Parallel Processing,Task,我需要获取并行执行的多个任务的返回值,并将它们合并到一个新的列表 var TaskList = new List<Task<List<string>>(); 这就是我目前拥有的。正如您在小提琴中看到的,这些任务是并行执行的(执行时间约为1s)。问题是我不知道如何从每次执行中获取返回值(一个列表对象),以便合并它们 小提琴: 代码: 使用系统; 使用系统线程; 使用System.Threading.Tasks; 使用System.Collections.Generi

我需要获取并行执行的多个
任务
的返回值,并将它们合并到一个新的
列表

var TaskList = new List<Task<List<string>>();
这就是我目前拥有的。正如您在小提琴中看到的,这些任务是并行执行的(执行时间约为1s)。问题是我不知道如何从每次执行中获取返回值(一个
列表
对象),以便合并它们

小提琴:

代码:

使用系统;
使用系统线程;
使用System.Threading.Tasks;
使用System.Collections.Generic;
公共课程
{
公共静态void Main()
{
var filters=新列表
{
“A”、“B”、“C”
}
;
var api=新的api();
var TaskList=新列表();
foreach(过滤器中的var f)
{
var LastTask=新任务(()=>
{
返回api.GetArray(f);
}
);
LastTask.Start();
任务列表。添加(上一个任务);
}
Task.WaitAll(TaskList.ToArray());
foreach(任务列表中的变量t)
{
//我需要获取每个GetArray中返回的列表并合并它们
}
}
}
公共类API
{
公共列表GetArray(字符串参数)
{
睡眠(1000);
返回新列表{
参数+“1”,
参数+“2”,
参数+“3”,
};
}
}

您可以尝试使用
SelectMany
方法:

var result = TaskList.Select(t => t.Result)
                     .SelectMany(r => r)
                     .ToList();
最初,您将
任务列表
的每个元素(这是一个
任务列表
对象)投影到它的结果(在您的例子中是一个
列表
)中,然后使用
SelectMany
方法定义任务结果中所有字符串的序列。最后但并非最不重要的一点是,您必须调用
ToList
,以便执行查询并得到
列表

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

正如Sergey在下面的评论中正确指出的那样,您必须重新定义您的
任务列表

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

var TaskList=new list在这种特殊情况下,所有任务都返回一个
任务
。此类
任务
对象的
结果
属性是一个
列表
。一般来说,
Task
Result
属性是一个
T
对象。@emzero,请使用以下局部变量定义:
var TaskList=new List()。哦,你说得对。我错过了。谢谢大家!@谢尔盖布朗诺夫:好主意:)我会把它加到我的答案中。@Christos,谢谢你!当然。我讨厌迂腐,但任务不是“并行执行”的,是吗?它们是异步执行的。此外,您可以根据完成顺序采取行动,也可以根据另一项任务的完成情况继续执行。您是对的,但因为在我开始一项任务后,我要做的下一件事就是开始下一项任务,依此类推。我允许自己说,它们是并行执行的,因为总执行时间是1s,每个任务需要1s才能完成。