using System.Collections.Generic;
using System.Threading.Tasks;
using System.Threading.Tasks.Dataflow;
public static async Task Main()
var actionProcessWorkplace = new ActionBlock<Workplace>((workplace) =>
Console.WriteLine("workplace name: {0}", workplace.Name);
}, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 2 });
var actionProcessFacility = new ActionBlock<Facility>(async (facility) =>
Console.WriteLine("facility name: {0}", facility.Name);
foreach (var workplace in facility.Workplaces)
await actionProcessWorkplace.SendAsync(workplace).ConfigureAwait(false);
}, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 2 });
var actionProcessCompany = new ActionBlock<Company>(async (company) =>
Console.WriteLine("company name: {0}", company.Name);
foreach (var facility in company.Facilities)
await actionProcessFacility.SendAsync(facility).ConfigureAwait(false);;
}, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 2 });
foreach (var company in GetCompanies())
await actionProcessCompany.SendAsync(company).ConfigureAwait(false);
actionProcessCompany.Complete();
await actionProcessCompany.Completion.ConfigureAwait(false);
actionProcessFacility.Complete();
await actionProcessFacility.Completion.ConfigureAwait(false);
actionProcessWorkplace.Complete();
await actionProcessWorkplace.Completion.ConfigureAwait(false);
public static List<Company> GetCompanies()
Facilities = new List<Facility>
Name = "Company1Facility1",
Workplaces = new List<Workplace>
Name = "Company1Facility1Workplace1"
Name = "Company1Facility1Workplace2"
Facilities = new List<Facility>
Name = "Company2Facility1",
Workplaces = new List<Workplace>
Name = "Company2Facility1Workplace1"
Name = "Company2Facility1Workplace2"
public string Name { get; set; }
public List<Facility> Facilities { get; set; }
public string Name { get; set; }
public List<Workplace> Workplaces { get; set; }
public string Name { get; set; }