static async Task Main(string[] args) { var inputBlock = new TransformBlock <int, int>(n => { if (n == 2) { throw new Exception("exception thrown from inputBlock"); } return(n); }); var increasingBlock = CreateFilteringBlock <int>(); var printBlock = new ActionBlock <int>(n => Console.WriteLine($"Message {n} recived")); inputBlock.LinkToWithPropagation(increasingBlock); increasingBlock.LinkToWithPropagation(printBlock); inputBlock.Post(1); inputBlock.Post(2); inputBlock.Post(1); inputBlock.Post(3); inputBlock.Post(4); inputBlock.Post(2); inputBlock.Complete(); await printBlock.Completion; Console.WriteLine("done"); Console.ReadLine(); }
static void Main(string[] args) { var random = new Random(); var broadcastBlock = new BroadcastBlock <int>(null); var transformPositive = new TransformBlock <int, int>(x => { Task.Delay(random.Next(200)).Wait(); return(x); }); var transformNegative = new TransformBlock <int, int>(x => { Task.Delay(random.Next(300)).Wait(); return(x * -1); }); var joinBlock = new JoinBlock <int, int>(); var sumBlock = new ActionBlock <(int, int)>(tuple => { Console.WriteLine($"{tuple.Item1}+{tuple.Item2}={tuple.Item1+tuple.Item2}"); }); broadcastBlock.LinkToWithPropagation(transformPositive); broadcastBlock.LinkToWithPropagation(transformNegative); transformNegative.LinkToWithPropagation(joinBlock.Target1); transformPositive.LinkToWithPropagation(joinBlock.Target2); }
protected ITargetBlock <TSource> BuildPipeline(object context, out Task completionTask) { var readerBlock = new BufferBlock <TSource>(new DataflowBlockOptions { BoundedCapacity = Options.ReadChunkSize }); var processorBlock = new TransformBlock <TSource, TTarget>(async item => { return(await Processor().Process(item, context)); }, new ExecutionDataflowBlockOptions { BoundedCapacity = Options.ReadChunkSize, MaxDegreeOfParallelism = Options.MaxDegreeOfParallelism, SingleProducerConstrained = true }); var batchblock = new BatchBlock <TTarget>(Options.ReadChunkSize); var writerBlock = new ActionBlock <IEnumerable <TTarget> >(async items => { var writer = Writer(); await writer.Write(items.ToArray(), context); }, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = Options.MaxDegreeOfParallelism }); readerBlock.LinkToWithPropagation(processorBlock); processorBlock.LinkToWithPropagation(batchblock); if (AccumulatingBlock != null) { var accumBlock = AccumulatingBlock(); batchblock.LinkToWithPropagation(accumBlock); accumBlock.LinkToWithPropagation(writerBlock); } else { batchblock.LinkToWithPropagation(writerBlock); } completionTask = new Task(() => { writerBlock.Completion.Wait(); Logger.LogTrace("writerBlock.Completion.Wait() returned"); if (CompletionWriter != null) { Logger.LogTrace("Calling CompletionWriter"); CompletionWriter.Write(null, context).Wait(); Logger.LogTrace("CompletionWriter returned"); } }); completionTask.Start(); return(readerBlock); }
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); } }
protected ITargetBlock <TSource> BuildPipeline(object context, out Task completionTask) { var readerBlock = new BufferBlock <TSource>(new DataflowBlockOptions { BoundedCapacity = Options.ReadChunkSize }); var processorBlock = new TransformBlock <TSource, TTarget>(async item => { return(await Processor().Process(item, context)); }, new ExecutionDataflowBlockOptions { BoundedCapacity = Options.ReadChunkSize, MaxDegreeOfParallelism = Options.MaxDegreeOfParallelism, SingleProducerConstrained = true }); var batchblock = new BatchBlock <TTarget>(Options.ReadChunkSize); var taskScheduler = new ConcurrentExclusiveSchedulerPair(); var writerBlock = new ActionBlock <ICollection <TTarget> >(async items => { var writer = Writer(); await writer.Write(items, context); }, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = Options.MaxDegreeOfParallelism, TaskScheduler = taskScheduler.ExclusiveScheduler }); readerBlock.LinkToWithPropagation(processorBlock); processorBlock.LinkToWithPropagation(batchblock); batchblock.LinkToWithPropagation(writerBlock); completionTask = new Task(() => { writerBlock.Completion.Wait(); Logger.LogDebug("writerBlock.Completion.Wait() returned"); if (CompletionWriter != null && Accumulator != null) { Logger.LogDebug("Calling CompletionWriter"); CompletionWriter.Write(Accumulator, context).Wait(); Logger.LogDebug("CompletionWriter returned"); } }); completionTask.Start(); return(readerBlock); }
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"); }