public IMessageReceiver SelectReceiver(GrpcTransportMessage message)
        {
            Receiver selected;

            do
            {
                selected = _current;
            }while (Interlocked.CompareExchange(ref _current, selected.Next, selected) != selected);

            return(selected.Current);
        }
        public Task <IMessageReceiver> Next(GrpcTransportMessage message, CancellationToken cancellationToken)
        {
            Task <IReceiverLoadBalancer> task = _balancer.Task;

            if (task.IsCompletedSuccessfully())
            {
                var balancer = task.GetAwaiter().GetResult();
                var consumer = balancer.SelectReceiver(message);

                return(Task.FromResult(consumer));
            }

            async Task <IMessageReceiver> NextAsync()
            {
                var balancer = await _balancer.Task.OrCanceled(cancellationToken).ConfigureAwait(false);

                return(balancer.SelectReceiver(message));
            }

            return(NextAsync());
        }
        public Task Send(GrpcTransportMessage message, CancellationToken cancellationToken)
        {
            var deliveryContext = new GrpcDeliveryContext(message, cancellationToken);

            return(Deliver(deliveryContext));
        }