internal override Task OnOpenAsync()
        {
            SocketConnectionListener socketListener = null;

            if (listenSocket != null)
            {
                socketListener = new SocketConnectionListener(listenSocket, this, false);
                listenSocket   = null;
            }
            else
            {
                int port = registration.ListenUri.Port;
                if (port == -1)
                {
                    port = TcpUri.DefaultPort;
                }

                socketListener = new SocketConnectionListener(new IPEndPoint(ipAddress, port), this, false);
            }

            connectionListener = new BufferedConnectionListener(socketListener, MaxOutputDelay, ConnectionBufferSize);
            connectionDemuxer  = new ConnectionDemuxer(connectionListener,
                                                       MaxPendingAccepts, MaxPendingConnections, ChannelInitializationTimeout,
                                                       IdleTimeout, MaxPooledConnections,
                                                       OnGetTransportFactorySettings,
                                                       OnGetSingletonMessageHandler,
                                                       OnHandleServerSessionPreamble,
                                                       OnDemuxerError);

            bool startedDemuxing = false;

            try
            {
                connectionDemuxer.StartDemuxing();
                startedDemuxing = true;
            }
            finally
            {
                if (!startedDemuxing)
                {
                    connectionDemuxer.Dispose();
                }
            }

            return(Task.CompletedTask);
        }
        void Cleanup()
        {
            lock (ThisLock)
            {
                if (closed)
                {
                    return;
                }

                closed = true;
            }

            if (connectionDemuxer != null)
            {
                connectionDemuxer.Dispose();
            }

            if (connectionListener != null)
            {
                connectionListener.Dispose();
            }

            registration.OnClose(this);
        }