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 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);