private async Task DoForAllReceivers(MessageReceiverTypes waitForReceiverTypes, Func<IEventBasedReceiver, Task> action)
        {
            var typesToProcessInBackground = (MessageReceiverTypes)((int)waitForReceiverTypes ^ -1);

              var messageReceiversToWaitFor = GetMessageReceiver(waitForReceiverTypes).ToArray();
              var messageReceiversToHandleInBackground = GetMessageReceiver(typesToProcessInBackground).ToArray();

              await messageReceiversToWaitFor.Select(async (receiver) =>  await action(receiver)).WhenAll();
              await messageReceiversToHandleInBackground.Select(async (receiver) => await action(receiver)).WhenAll();
        }
 private IEnumerable<IEventBasedReceiver> GetMessageReceiver(MessageReceiverTypes messageReceiverTypes)
 {
     if (messageReceiverTypes.HasFlag(MessageReceiverTypes.Command)) foreach (var messageReceiver in _commandEventBasedReceivers) yield return messageReceiver;
     if (messageReceiverTypes.HasFlag(MessageReceiverTypes.MulticastEvent)) foreach (var messageReceiver in _multicastEventEventBasedReceivers) yield return messageReceiver;
     if (messageReceiverTypes.HasFlag(MessageReceiverTypes.CompetingEvent)) foreach (var messageReceiver in _competingEventEventBasedReceivers) yield return messageReceiver;
 }
 public async Task Stop(MessageReceiverTypes messageReceiverTypes)
 {
     //we dont stop
     //await DoForAllReceivers(messageReceiverTypes, receiver => receiver.UnSubscribeToQueue());
     await Task.FromResult<object>(null);
 }
 public async Task SubscribeAllReceivers(MessageReceiverTypes messageReceiverTypes)
 {
     await DoForAllReceivers(messageReceiverTypes, receiver => receiver.SubscribeToQueue());
 }