public void Labors_Inductive_MultiThreading_Integration_Test() { Laboratory lab = new Laboratory(); Subject download = lab.Expanse(new InstantDeputy(typeof(FirstCurrency).FullName, nameof(FirstCurrency.GetFirstCurrency)), "Download"); download.Add(new InstantDeputy(typeof(SecondCurrency).FullName, nameof(SecondCurrency.GetSecondCurrency))); download.Visor.CreateLaborers(8); /// e.g. 8 workers/consumers for downloading 2 different currency rates Subject compute = lab.Expanse(new InstantDeputy(typeof(ComputeCurrency).FullName, nameof(ComputeCurrency.Compute)), "Compute"); compute.Add(new InstantDeputy(typeof(PresentResult).FullName, nameof(PresentResult.Present))); compute.Visor.CreateLaborers(4); /// e.g. 4 workers/consumers for computing and presenting results List <Labor> ComputeResultRequirements = new List <Labor>() { download[nameof(FirstCurrency.GetFirstCurrency)], download[nameof(SecondCurrency.GetSecondCurrency)] }; download[nameof(FirstCurrency.GetFirstCurrency)] .Laborer .AddEvoker(compute[nameof(ComputeCurrency.Compute)], ComputeResultRequirements); download[nameof(SecondCurrency.GetSecondCurrency)] .Laborer .AddEvoker(compute[nameof(ComputeCurrency.Compute)], ComputeResultRequirements); compute[nameof(ComputeCurrency.Compute)] .Laborer .AddEvoker(compute[nameof(PresentResult.Present)]); for (int i = 1; i < 15; i++) { download[nameof(FirstCurrency.GetFirstCurrency)].Elaborate("EUR", i); download[nameof(SecondCurrency.GetSecondCurrency)].Elaborate("USD", i); } Thread.Sleep(15000); download.Visor.Close(true); compute.Visor.Close(true); }