/// <summary> /// Begins the accept TCP client. /// </summary> /// <param name="callback">The callback.</param> /// <param name="state">The state.</param> /// <returns>Async property</returns> public IAsyncResult BeginAcceptTcpClient(AsyncCallback callback, object state) { Interlocked.Increment(ref mAsyncActiveAcceptTcpClientCount); TcpListenerAcceptTcpClientDelegate d = new TcpListenerAcceptTcpClientDelegate(this.AcceptTcpClient); if (this.mAsyncActiveAcceptTcpClientEvent == null) { lock (LOCK_ACCEPTCLIENT) { if (this.mAsyncActiveAcceptTcpClientEvent == null) { this.mAsyncActiveAcceptTcpClientEvent = new AutoResetEvent(true); } } } this.mAsyncActiveAcceptTcpClientEvent.WaitOne(); this.mAcceptTcpClientDelegate = d; return(d.BeginInvoke(callback, state)); }
/// <summary> /// Ends the accept TCP client. /// </summary> /// <param name="asyncResult">The async result.</param> /// <returns>TcpClient implementation</returns> public ITcpClient EndAcceptTcpClient(IAsyncResult asyncResult) { if (asyncResult == null) { ThrowHelper.ThrowArgumentNullException("asyncResult"); } if (this.mAcceptTcpClientDelegate == null) { ThrowHelper.ThrowArgumentException("Wrong async result or EndAcceptTcpClient called multiple times.", "asyncResult"); } try { return(this.mAcceptTcpClientDelegate.EndInvoke(asyncResult)); } finally { this.mAcceptTcpClientDelegate = null; this.mAsyncActiveAcceptTcpClientEvent.Set(); CloseAsyncActiveAcceptTcpClientEvent(Interlocked.Decrement(ref mAsyncActiveAcceptTcpClientCount)); } }