public async Task CloseAcceptAsync() { TaskCompletionSource <object> tcs = null; lock (_gate) { if (_state == State.Initial) { _state = State.Stopped; return; } else if (_state == State.AcceptClosed || _state == State.Stopping || _state == State.Stopped) { return; } else if (_state == State.ClosingAccept) { tcs = _stateChangeCompletion; } } if (tcs != null) { await tcs.Task; return; } try { await StartAsync(); } catch {} bool triggerStateChange = false; lock (_gate) { if (_state == State.AcceptClosed || _state == State.Stopping || _state == State.Stopped) { return; } else if (_state == State.ClosingAccept) { tcs = _stateChangeCompletion; } else if (_state == State.Started) { triggerStateChange = true; tcs = _stateChangeCompletion = new TaskCompletionSource <object>(); _state = State.ClosingAccept; } else { // Cannot happen ThrowInvalidState(); } } if (triggerStateChange) { _threadContext.CloseAccept(); } await tcs.Task; }