Пример #1
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
        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ı");
        }
Пример #7
0
        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");
        }