public async Task CloseAsync(Exception e, bool awaitAll) { if (!IsSynced && !Client.Connected) { return; } IsSynced = false; if (e == null) { await SendCommand(OwnTcpCommunicator.CloseCmd, true).ConfigureAwait(false); } PingSem.Release(); SendQueue.End(); await ProcessQueue.End().ConfigureAwait(false); Client.Dispose(); foreach (OwnTcpSendMessage message in Waits.Values) { message.SetResult(false); } Task raiseTask = RaiseDisconnected(); if (awaitAll) { await raiseTask.ConfigureAwait(false); } async Task RaiseDisconnected() { if (Task != null) { await Task.ConfigureAwait(false); } Disconnected?.Invoke(this, new DisconnectedEventArgs(e == null, e)); } }