任务按组组合成一个组
本文关键字:一个 组合 任务 | 更新日期: 2023-09-27 18:27:00
假设我拥有实现IGenerator
的所有类
List<IGenerator> generators = new List<IGenerator> { new Jane1Generator(), new Jane2Generator(), new JohnGenerator() };
和
public interface IGenerator
{
string GetFirstName();
Task<List<Items>> Generate();
}
因此,用GetFirstName()
对generators
进行分组将使Jane1
和Jane2
处于同一类别中。如何将Jane1
和Jane2
的任务合并为一个任务,并将John
分开。我想把两个Janes的结果合并成一个列表。
foreach (var groupedByName in generators.GroupBy(i => i.GetFirstName()))
{
//Combine Tasks of Jane1 & Jane2
//give me a new Task that's is the sum of Jane1 & Jane2 tasks.
//almost like List<Items>.Join(AnotherList) wrapped with a Task, so I can wait for both Tasks and Get combined Results instead.
}
所以如果我创建一个List<Task<List<Items>>> tasks = new List<Task<List<Items>>>();
我希望tasks
列表只包含两个元素。一个是Jane1&Jane2和另一个只有John,所以我可以做
await Task.WhenAll(tasks);
Console.Write("Done");
您可以从GroupBy
开始,按名称对所有生成器进行分组。
然后将这些组选择到所需的信息中,即名称和项目。
要获得代表该组所有项目的任务,可以使用Select
获得该组中每个生成器的所有项目的序列。把它交给WhenAll
给了我们一个任务,当所有生成器都完成时就会完成。然后,我们可以为该任务添加一个延续,将所有项目组合到一个列表中。
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())
});
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());
}));
其中results
是按其firstName列出的我的组项目的列表。