public async Task TestDataBroadcaster1()
        {
            var random = new Random();
            var dataCopier = new DataBroadcaster<int>();

            int sum1 = 0;
            int sum2 = 0;

            var action1 = new ActionBlock<int>(i => sum1 = sum1 + i);
            var action2 = new ActionBlock<int>(i => sum2 = sum2 + i);

            dataCopier.LinkTo(DataflowUtils.FromBlock(action1));
            dataCopier.LinkTo(DataflowUtils.FromBlock(action2));

            for (int j = 0; j < 1000; j++)
            {
                dataCopier.InputBlock.Post((int) (random.NextDouble()*10000));
            }

            dataCopier.Complete();

            await TaskEx.AwaitableWhenAll(action1.Completion, action2.Completion);

            Console.WriteLine("sum1 = {0} , sum2 = {1}", sum1, sum2);
            Assert.AreEqual(sum1, sum2);
        }
Example #2
0
        public async Task TestDataBroadcaster1()
        {
            var random     = new Random();
            var dataCopier = new DataBroadcaster <int>();

            int sum1 = 0;
            int sum2 = 0;

            var action1 = new ActionBlock <int>(i => sum1 = sum1 + i);
            var action2 = new ActionBlock <int>(i => sum2 = sum2 + i);

            dataCopier.LinkTo(DataflowUtils.FromBlock(action1));
            dataCopier.LinkTo(DataflowUtils.FromBlock(action2));

            for (int j = 0; j < 1000; j++)
            {
                dataCopier.InputBlock.Post((int)(random.NextDouble() * 10000));
            }

            dataCopier.InputBlock.Complete();

            await TaskEx.AwaitableWhenAll(action1.Completion, action2.Completion);

            Console.WriteLine("sum1 = {0} , sum2 = {1}", sum1, sum2);
            Assert.AreEqual(sum1, sum2);
        }
Example #3
0
        public AppraisersFlow(IEnumerable <Appraiser> appraisers)
            : base(DataflowOptions.Default)
        {
            if (appraisers is null)
            {
                throw new ArgumentNullException(nameof(appraisers));
            }


            _inputConsumer = new DataBroadcaster <IReadOnlyList <IData> >(crawlersData =>
            {
                Console.WriteLine($"Broadcasts all crawlers data. {crawlersData.Count.ToString()}");
                return(crawlersData);
            }, DataflowOptions.Default);

            _resultConsumer = new TransformBlock <IReadOnlyList <string>, IReadOnlyList <string> >(
                appraisedData => appraisedData
                ).ToDataflow(DataflowOptions.Default);

            var usedTypes = new Dictionary <Type, DataBroadcaster <IReadOnlyList <IData> > >();

            foreach (var appraiser in appraisers)
            {
                if (!usedTypes.TryGetValue(appraiser.DataType, out var broadcaster))
                {
                    broadcaster = new DataBroadcaster <IReadOnlyList <IData> >(crawlersData =>
                    {
                        Console.WriteLine($"Broadcasts specified data of type {appraiser.DataType.Name}. {crawlersData.Count.ToString()}");
                        return(crawlersData);
                    }, DataflowOptions.Default);

                    usedTypes.Add(appraiser.DataType, broadcaster);
                    _inputConsumer.TransformAndLink(
                        broadcaster,
                        l => l,
                        l => l.All(d => d.GetType().IsAssignableFrom(appraiser.DataType))
                        );
                    RegisterChild(broadcaster);
                }
                var appraiserFlow = DataflowUtils.FromDelegate(appraiser.Func, DataflowOptions.Default);
                broadcaster.LinkTo(appraiserFlow);
                appraiserFlow.LinkTo(_resultConsumer);

                _resultConsumer.RegisterDependency(appraiserFlow);
                RegisterChild(appraiserFlow);
            }

            RegisterChild(_inputConsumer);
            RegisterChild(_resultConsumer);
        }
Example #4
0
        public static async Task BroadcasterDemo()
        {
            var broadcaster = new DataBroadcaster <string>();

            var printer1 = new ActionBlock <string>(s => Console.WriteLine("Printer1: {0}", s)).ToDataflow();
            var printer2 = new ActionBlock <string>(s => Console.WriteLine("Printer2: {0}", s)).ToDataflow();
            var printer3 = new ActionBlock <string>(s => Console.WriteLine("Printer3: {0}", s)).ToDataflow();

            broadcaster.LinkTo(printer1);
            broadcaster.LinkTo(printer2);
            broadcaster.LinkTo(printer3);

            broadcaster.Post("first message");
            broadcaster.Post("second message");
            broadcaster.Post("third message");

            await broadcaster.SignalAndWaitForCompletionAsync();

            await printer1.CompletionTask;
            await printer2.CompletionTask;
            await printer3.CompletionTask;
        }
Example #5
0
        private void InitFlow(IEnumerable <Funcotype> appraisers)
        {
            var usedTypes = new Dictionary <Type, DataBroadcaster <BasicInfo> >();

            foreach (Funcotype appraiser in appraisers)
            {
                if (!usedTypes.TryGetValue(appraiser.DataType, out var broadcaster))
                {
                    broadcaster = new DataBroadcaster <BasicInfo>(
                        crawlersData => crawlersData, DataflowOptions.Default
                        );

                    usedTypes.Add(appraiser.DataType, broadcaster);
                    _inputConsumer.TransformAndLink(
                        broadcaster,
                        info => info,
                        info => info.GetType().IsAssignableFrom(appraiser.DataType)
                        );
                    RegisterChild(broadcaster);
                }

                Dataflow <BasicInfo, RatingDataContainer> appraiserFlow = DataflowUtils.FromDelegate(
                    appraiser.Func, DataflowOptions.Default
                    );


                broadcaster.LinkTo(appraiserFlow);
                appraiserFlow.LinkTo(_resultConsumer);

                _resultConsumer.RegisterDependency(appraiserFlow);
                RegisterChild(appraiserFlow);
            }

            RegisterChild(_inputConsumer);
            RegisterChild(_resultConsumer);
        }
Example #6
0
        public static async Task BroadcasterDemo()
        {
            var broadcaster = new DataBroadcaster<string>();

            var printer1 = new ActionBlock<string>(s => Console.WriteLine("Printer1: {0}", s)).ToDataflow();
            var printer2 = new ActionBlock<string>(s => Console.WriteLine("Printer2: {0}", s)).ToDataflow();
            var printer3 = new ActionBlock<string>(s => Console.WriteLine("Printer3: {0}", s)).ToDataflow();

            broadcaster.LinkTo(printer1);
            broadcaster.LinkTo(printer2);
            broadcaster.LinkTo(printer3);

            broadcaster.Post("first message");
            broadcaster.Post("second message");
            broadcaster.Post("third message");

            await broadcaster.SignalAndWaitForCompletionAsync();
            await printer1.CompletionTask;
            await printer2.CompletionTask;
            await printer3.CompletionTask;
        }