public async Task CloseAsync(CancellationToken cancellationToken)
        {
            try
            {
                _listenerLock.WaitOne();
                Status = CommunicationListenerStatus.Closing;

                var tasks = _listeners.Select(listener => CloseListener(listener.Key, listener.Value, cancellationToken)).ToList();

                await Task.WhenAll(tasks);
                Status = CommunicationListenerStatus.Closed;
            }
            finally
            {
                _listenerLock.Set();
            }
        }
        public void Abort()
        {
            try
            {
                _listenerLock.WaitOne();

                Status = CommunicationListenerStatus.Aborting;
                foreach (var listener in _listeners)
                {
                    AbortListener(listener.Key, listener.Value);
                }

                Status = CommunicationListenerStatus.Aborted;
            }
            finally
            {
                _listenerLock.Set();
            }
        }
        public async Task<string> OpenAsync(CancellationToken cancellationToken)
        {
            try
            {
                ValidateListeners();

                _listenerLock.WaitOne();

                Status = CommunicationListenerStatus.Opening;

                var tasks = _listeners.Select(listener => Task.Run(async () =>
                {
                    await OpenListener(listener.Key, listener.Value, cancellationToken);
                }, cancellationToken)).ToList();

                await Task.WhenAll(tasks);
                
                InitializeOnCreateListeningAddress();
                Status = CommunicationListenerStatus.Opened;
                return string.Empty;
            }
            finally
            {
                _listenerLock.Set();
            }
        }