public async Task SplitJoin_CorrectlyBuild() { // arrange var process = new ConcurrentBag <string> (); var split_block = DataflowSplitJoin.CreateSplitBlockAsync <string, char> (async s => { await Task.Yield(); process.Add(s); return(s.ToCharArray()); }); var join_block = DataflowSplitJoin.CreateFinalJoinBlock <string, char> (); split_block.LinkWithCompletionPropagation(join_block); // act foreach (var str in new[] { "a", "bb", "ccc" }) { await split_block.SendAsync(str); } split_block.Complete(); await Task.WhenAll(split_block.Completion, join_block.Completion); // assert process.Should().BeEquivalentTo("a", "bb", "ccc"); }
public async Task SplitJoin_SplitReturnsNull_DoesNotThrow() { // arrange var exceptions = new ConcurrentBag <Exception> (); var split_block = DataflowSplitJoin.CreateSplitBlockAsync <string, char> (async s => { await Task.Yield(); return(null); }, defaultExceptionLogger: (ex, obj) => exceptions.Add(ex)); var join_block = DataflowSplitJoin.CreateFinalJoinBlock <string, char> (); split_block.LinkWithCompletionPropagation(join_block); // act await split_block.SendAsync("abc"); split_block.Complete(); await Task.WhenAll(split_block.Completion, join_block.Completion); // assert exceptions.Should().BeEmpty(); }
public async Task SplitProcessJoin_CorrectlyBuild() { // arrange var process = new ConcurrentBag <char> (); var split_block = DataflowSplitJoin.CreateSplitBlock <string, char> (s => s.ToCharArray()); var process_block = DataflowSplitJoin.CreateProcessBlock <string, char> ((s, c) => process.Add(c)); var join_block = DataflowSplitJoin.CreateFinalJoinBlock <string, char> (); split_block.LinkWithCompletionPropagation(process_block); process_block.LinkWithCompletionPropagation(join_block); // act foreach (var str in new[] { "a", "bb", "ccc" }) { await split_block.SendAsync(str); } split_block.Complete(); await Task.WhenAll(split_block.Completion, join_block.Completion); // assert process.Should().BeEquivalentTo('a', 'b', 'b', 'c', 'c', 'c'); }
/// <summary> /// Creates a dataflow block from current configuration. /// </summary> protected override ITargetBlock <SplitJoinItem <TParent, TItem> > CreateBlock() { ITargetBlock <SplitJoinItem <TParent, TItem> > block; if (this.processAsync != null) { block = DataflowSplitJoin.CreateFinalJoinBlockAsync(this.processAsync, this.DefaultExceptionLogger); } else if (this.processSync != null) { block = DataflowSplitJoin.CreateFinalJoinBlock(this.processSync, this.DefaultExceptionLogger); } else { block = DataflowSplitJoin.CreateFinalJoinBlock <TParent, TItem> (); } return(block); }