private static void Main(string[] args) { var rand = new Random(DateTime.Now.Millisecond); var telemetryClient = new TelemetryClient { InstrumentationKey = "c615d051-eefa-4d55-8e53-bdcdd5a92ff3" }; DataflowMetric.TelemetryClient = telemetryClient; var broadcastBlock = new BroadcastBlock <int>(null); var transformPositive = new TransformBlock <int, int>(x => { using (new DataflowMetric("TransformPositive")) { Task.Delay(rand.Next(200)).Wait(); return(x); } }); var transformNegative = new TransformBlock <int, int>(x => { using (new DataflowMetric("TransformNegative")) { Task.Delay(rand.Next(300)).Wait(); return(x * -1); } }); var join = new JoinBlock <int, int>(); var sumBlock = new ActionBlock <Tuple <int, int> >(tuple => { using (new DataflowMetric("SumBlock")) { Console.WriteLine("{0}+({1})={2}", tuple.Item1, tuple.Item2, tuple.Item1 + tuple.Item2); } }); broadcastBlock.LinkToWithPropagation(transformPositive); broadcastBlock.LinkToWithPropagation(transformNegative); transformPositive.LinkToWithPropagation(join.Target1); transformNegative.LinkToWithPropagation(join.Target2); join.LinkToWithPropagation(sumBlock); while (true) { broadcastBlock.Post(rand.Next(100)); Thread.Sleep(200); } }
public static async Task Run() { var broadcastBlock = new BroadcastBlock <int>(a => a); var a1 = new TransformBlock <int, int>(a => { Console.WriteLine($"Mesaj {a} a1 tarafından işlenildi."); Task.Delay(300).Wait(); return(-a); }); var a2 = new TransformBlock <int, int>(a => { Console.WriteLine($"Mesaj {a} a2 tarafından işlenildi."); Task.Delay(300).Wait(); return(a); }); var joinBlock = new JoinBlock <int, int>(); a1.LinkToWithPropagation(joinBlock.Target1); a2.LinkToWithPropagation(joinBlock.Target2); broadcastBlock.LinkToWithPropagation(a1); broadcastBlock.LinkToWithPropagation(a2); var finalBlock = new ActionBlock <Tuple <int, int> >(a => { Console.WriteLine($"{a.Item1}: tüm consumer'lar tarafından işlenildi"); }); joinBlock.LinkToWithPropagation(finalBlock); for (int i = 0; i < 10; i++) { await broadcastBlock.SendAsync(i); } broadcastBlock.Complete(); finalBlock.Completion.Wait(); Console.WriteLine("Tamamlandı"); }
static async Task Main(string[] args) { var broadcastBlock = new BroadcastBlock <int>(a => a, new DataflowBlockOptions() { BoundedCapacity = 1 } ); var a1 = new TransformBlock <int, int>( a => { Console.WriteLine($"Message {a} was processed by consumer 1"); if (a % 2 == 0) { Task.Delay(300).Wait(); } else { Task.Delay(50).Wait(); } return(a * -1); }, new ExecutionDataflowBlockOptions() { MaxDegreeOfParallelism = 3 }); var a2 = new TransformBlock <int, int>( a => { Console.WriteLine($"Message {a} was processed by consumer 2"); if (a % 2 != 0) { Task.Delay(300).Wait(); } else { Task.Delay(50).Wait(); } return(a); }, new ExecutionDataflowBlockOptions() { MaxDegreeOfParallelism = 3 }); broadcastBlock.LinkToWithPropagation(a1); broadcastBlock.LinkToWithPropagation(a2); var joinblock = new JoinBlock <int, int>(); a1.LinkToWithPropagation(joinblock.Target1); a2.LinkToWithPropagation(joinblock.Target2); var printBlock = new ActionBlock <Tuple <int, int> >( a => Console.WriteLine($"Message {a} was processed. Sum: {a.Item1 + a.Item2}") ); joinblock.LinkToWithPropagation(printBlock); for (int i = 0; i < 10; i++) { await broadcastBlock.SendAsync(i); } broadcastBlock.Completion.ContinueWith(a => Console.WriteLine("broadcastBlock completed")); broadcastBlock.Complete(); await printBlock.Completion; Console.WriteLine("done"); }