Пример #1
0
        public async Task ActionBlock_CorrectlyProceed()
        {
            // arrange
            var result = new ConcurrentQueue <string> ();

            var block = new ActionBlock <string> (s => result.Enqueue(s));

            var sut = new Dataflow <string> (block, block);


            // act
            await sut.ProcessAsync(new[] { "a", "b", "c" });


            // assert
            result.Should().BeEquivalentTo("a", "b", "c");
        }
Пример #2
0
        public async Task ActionThenTransformBlock_CorrectlyProceed()
        {
            // arrange
            var result = new ConcurrentQueue <string> ();

            var starting_block = new TransformBlock <string, string> (s => s);
            var final_block    = new ActionBlock <string> (s => result.Enqueue(s));

            starting_block.LinkWithCompletionPropagation(final_block);

            var sut = new Dataflow <string> (starting_block, final_block);


            // act
            await sut.ProcessAsync(new[] { "a", "b", "c" });


            // assert
            result.Should().BeEquivalentTo("a", "b", "c");
        }
Пример #3
0
        /// <summary>
        /// Process the specified number of inputs to outputs via the async dataflow
        /// </summary>
        /// <param name="dataflow">Target dataflow</param>
        /// <param name="input">Input enumerable</param>
        /// <param name="output">Transformed output</param>
        /// <param name="count">Count to process</param>
        /// <typeparam name="TIn">Input type</typeparam>
        /// <typeparam name="TOut">Transformed type</typeparam>
        /// <returns>True if all input has been processed</returns>
        public static async Task <bool> ProcessAsync <TIn, TOut>(this Dataflow <TIn, TOut> dataflow, IEnumerable <TIn> input, List <TOut> output, int count)
        {
            var bufferBlock = new BufferBlock <TOut>();

            dataflow.OutputBlock.LinkTo(bufferBlock, new DataflowLinkOptions {
                MaxMessages = count
            });
            await dataflow.ProcessAsync(input.Take(count), false);

            while (output.Count < count)
            {
                await bufferBlock.OutputAvailableAsync(); // .Timeout(Configuration.Timeout);

                if (!bufferBlock.TryReceiveAll(out var newEvents))
                {
                    break;
                }
                output.AddRange(newEvents);
            }

            return(output.Count == count);
        }