using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //var buffer1 = new BlockingCollection<int>(10); //Qtd maxima de 10 na pilha //var buffer2 = new BlockingCollection<int>(10); var buffer1 = new BlockingCollection<int>(); //Sem qtd maxima na pilha var buffer2 = new BlockingCollection<int>(); var f = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None); //List<Task> t = new List<Task>(); //t.Add(f.StartNew(() => CreateInitialRange(buffer1))); Task[] tasks = new Task[3]; //Start the phases of the pipeline //Task stage1 = f.StartNew(() => CreateInitialRange(buffer1)); //Task stage2 = f.StartNew(() => DoubleTheRange(buffer1, buffer2)); //Task stage3 = f.StartNew(() => WriteResults(buffer2)); tasks[0] = f.StartNew(() => CreateInitialRange(buffer1)); tasks[1] = f.StartNew(() => DoubleTheRange(buffer1, buffer2)); tasks[2] = f.StartNew(() => WriteResults(buffer2)); //wait for the phases to complete //Task.WaitAll(stage1, stage2, stage3); Task.WaitAll(tasks); Console.WriteLine("Pressione uma tecla..."); Console.ReadLine(); } static void CreateInitialRange(BlockingCollection<int> output) { try { for (int i = 1; i <= 50; i++) { Console.WriteLine("Inicio {0}, qtd {1}", i, output.Count()); //Console.WriteLine("CreateInitialRange {0}", i); Thread.Sleep(200); output.Add(i); } } finally { output.CompleteAdding(); } } static void DoubleTheRange(BlockingCollection<int> input, BlockingCollection<int> output) { try { foreach (var number in input.GetConsumingEnumerable()) { Console.WriteLine("Meio {0}, qtd input {1}, qtd output {2}", number * number, input.Count(), output.Count()); Thread.Sleep(400); output.Add(number * number); } } finally { output.CompleteAdding(); } } static void WriteResults(BlockingCollection<int> input) { foreach (var squaredNumber in input.GetConsumingEnumerable()) { //Console.WriteLine("Result is {0}", squaredNumber); Console.WriteLine("Fim {0}, qtd {1}", squaredNumber, input.Count()); Thread.Sleep(800); } } } }
Fonte: Link