C# 按组合并为单个组的任务
假设所有类都实现了C# 按组合并为单个组的任务,c#,.net,task,.net-4.5,async-await,C#,.net,Task,.net 4.5,Async Await,假设所有类都实现了IGenerator List<IGenerator> generators = new List<IGenerator> { new Jane1Generator(), new Jane2Generator(), new JohnGenerator() }; 因此,如果我创建一个List tasks=newlist() 我希望tasks列表只包含两个元素。一个是Jane1和Jane2的联合任务,另一个是John,这样我就可以做了 await Ta
IGenerator
List<IGenerator> generators = new List<IGenerator> { new Jane1Generator(), new Jane2Generator(), new JohnGenerator() };
因此,如果我创建一个List tasks=newlist()代码>
我希望tasks
列表只包含两个元素。一个是Jane1和Jane2的联合任务,另一个是John,这样我就可以做了
await Task.WhenAll(tasks);
Console.Write("Done");
tasks.Add(Task.Factory.continuewhall(results.ToArray()),
myTasks=>
{
var newList=新列表();
foreach(结果中的var i)
{
newList.AddRange(i.Result);
}
返回DoSomething(newList.AsEnumerable());
}));
其中,results
是按名字排列的“我的组”项目列表 您可以从GroupBy
开始,按名称对所有生成器进行分组
然后将这些组选择到所需的信息中,即名称和项目
要获取代表该组所有项目的任务,您可以使用选择
获取该组中每个生成器的所有项目序列。当所有的发电机都完成时,把它交给whalll
给我们一个任务。然后,我们可以向该任务添加一个延续,将所有项合并到一个列表中
var groups = generators.GroupBy(gen => gen.GetFirstName())
.Select(group => new
{
Name = group.Key,
Items = Task.WhenAll(group.Select(gen => gen.Generate()))
.ContinueWith(t => t.Result.SelectMany(items => items).ToList())
});
我不明白,为什么你需要Jane一家在一起,而最终,你只想等到一切都完成?我只想把Jane的结果结合在一起。我将结果合并到一个不同的列表中,我希望该列表只包含两个元素。Janes和John生成项目。
await Task.WhenAll(tasks);
Console.Write("Done");
tasks.Add(Task<IEnumerable<Items>>.Factory.ContinueWhenAll(results.ToArray(),
myTasks =>
{
var newList = new List<Items>();
foreach (var i in results)
{
newList.AddRange(i.Result);
}
return DoSomething(newList.AsEnumerable());
}));
var groups = generators.GroupBy(gen => gen.GetFirstName())
.Select(group => new
{
Name = group.Key,
Items = Task.WhenAll(group.Select(gen => gen.Generate()))
.ContinueWith(t => t.Result.SelectMany(items => items).ToList())
});