private IAsyncResult BeginGetClientCertificateCore(AsyncCallback requestCallback, object state)
        {
            var asyncResult = new GetClientCertificateAsyncResult(this, state, requestCallback);

            // The certificate is already retrieved by the time this method is called. GetClientCertificateCore() evaluates to
            // a simple member access, so this will always complete immediately.
            ClientCertState = ListenerClientCertState.Completed;
            asyncResult.InvokeCallback(GetClientCertificateCore());

            return(asyncResult);
        }
        public X509Certificate2 EndGetClientCertificate(IAsyncResult asyncResult)
        {
            if (asyncResult == null)
            {
                throw new ArgumentNullException(nameof(asyncResult));
            }

            GetClientCertificateAsyncResult clientCertAsyncResult = asyncResult as GetClientCertificateAsyncResult;

            if (clientCertAsyncResult == null || clientCertAsyncResult.AsyncObject != this)
            {
                throw new ArgumentException(SR.net_io_invalidasyncresult, nameof(asyncResult));
            }
            if (clientCertAsyncResult.EndCalled)
            {
                throw new InvalidOperationException(SR.Format(SR.net_io_invalidendcall, nameof(EndGetClientCertificate)));
            }
            clientCertAsyncResult.EndCalled = true;

            return((X509Certificate2)clientCertAsyncResult.Result);
        }