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); }
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); }
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); }
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; }
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); }
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; }