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