コード例 #1
0
        public async Task TestProducerConsumerAsyncEnumerable()
        {
            foreach (TaskScheduler scheduler in new[] { TaskScheduler.Default, new ConcurrentExclusiveSchedulerPair().ConcurrentScheduler })
            {
                foreach (int maxMessagesPerTask in new[] { DataflowBlockOptions.Unbounded, 1, 2 })
                {
                    foreach (int boundedCapacity in new[] { DataflowBlockOptions.Unbounded, 1, 2 })
                    {
                        foreach (int dop in new[] { 1, 2, 8 })
                        {
                            foreach (int elementsPerItem in new[] { 1, 5, 100 })
                            {
                                foreach (bool ensureOrdered in DataflowTestHelpers.BooleanValues)
                                {
                                    const int Messages = 100;
                                    var       options  = new ExecutionDataflowBlockOptions
                                    {
                                        BoundedCapacity        = boundedCapacity,
                                        MaxDegreeOfParallelism = dop,
                                        MaxMessagesPerTask     = maxMessagesPerTask,
                                        TaskScheduler          = scheduler,
                                        EnsureOrdered          = ensureOrdered,
                                    };
                                    TransformManyBlock <int, int> tb = new TransformManyBlock <int, int>(i => AsyncEnumerable.Repeat(i, elementsPerItem), options);

                                    await Task.WhenAll(
                                        Task.Run(async delegate // consumer
                                    {
                                        if (ensureOrdered)
                                        {
                                            int i         = 0;
                                            int processed = 0;
                                            while (await tb.OutputAvailableAsync())
                                            {
                                                Assert.Equal(expected: i, actual: await tb.ReceiveAsync());
                                                processed++;
                                                if (processed % elementsPerItem == 0)
                                                {
                                                    i++;
                                                }
                                            }
                                        }
                                        else
                                        {
                                            var results = new List <int>();
                                            await foreach (int result in tb.ReceiveAllAsync())
                                            {
                                                results.Add(result);
                                            }

                                            IEnumerable <IGrouping <int, int> > messages = results.GroupBy(i => i);
                                            Assert.Equal(Messages, messages.Count());
                                            Assert.All(messages, m => Assert.Equal(elementsPerItem, m.Count()));
                                        }
                                    }),