Пример #1
0
        public void Should_show_that_the_message_was_received_by_the_consumer()
        {
            var multiConsumer = new MultiConsumer();
            ReceivedMessageList<PingMessage> received = multiConsumer.Consume<PingMessage>();

            multiConsumer.Subscribe(LocalBus);

            LocalBus.Publish(new PingMessage());

            received.Any().ShouldBeTrue();
        }
Пример #2
0
        public void Should_show_that_the_message_was_received_by_the_consumer()
        {
            var multiConsumer = new MultiConsumer();
            ReceivedMessageList <PingMessage> received = multiConsumer.Consume <PingMessage>();

            multiConsumer.Subscribe(LocalBus);

            LocalBus.Publish(new PingMessage());

            received.Any().ShouldBeTrue();
        }
            public static async Task Consume(
                IAsyncEnumerable <T> source,
                IEnumerable <ConsumerDelegate <T> > consumers,
                CancellationToken token)
            {
                if (source == null)
                {
                    throw new ArgumentNullException(nameof(source));
                }
                if (consumers == null)
                {
                    throw new ArgumentNullException(nameof(consumers));
                }
                token.ThrowIfCancellationRequested();

                var collection = consumers as IReadOnlyCollection <ConsumerDelegate <T> > ?? consumers.ToList();

                switch (collection.Count)
                {
                case 0: return;

                case 1:
                    await collection.Single()(source, token).ConfigureAwait(false);

                    break;

                default:
                    var multi       = new MultiConsumer <T>(collection.Count, token);
                    var connectable = source.Connectable(out var connect);
                    foreach (var consumer in collection)
                    {
                        // ReSharper disable once PossibleMultipleEnumeration
                        multi.Subscribe(connectable, consumer);
                    }
                    connect();
                    await multi._atmbWhenAll.Task.ConfigureAwait(false);

                    break;
                }
            }
 /// <summary>
 /// Multiple consumers sharing a subscription.
 /// </summary>
 public static Task MultiConsume <T>(this IAsyncEnumerable <T> source, CancellationToken token, params ConsumerDelegate <T>[] consumers)
 => MultiConsumer <T> .Consume(source, consumers, token);