/// <summary> /// Removes an adapter from this switch. /// </summary> /// <param name="adapter">Adapter to be removed.</param> /// <param name="stopAdapter">Whether the adapter should be stopped after removal. Default value is <see langword="false"/>.</param> public void RemoveAdapter(IRemoteHubAdapter<byte[]> adapter, bool stopAdapter = false) { adapter.RemoteClientUpdated -= OnAdapterRemoteClientUpdated; adapter.RemoteClientRemoved -= OnAdapterRemoteClientRemoved; adapter.RemoveOnMessageReceivedCallback(OnPrivateMessageReceivedCallback); if (adapters.TryGetValue(adapter, out var idList)) { if (adapters.TryRemove(adapter, out _)) { foreach (var remoteClientId in idList.Keys) { RemoveAdapterFromAdapterOfClients(remoteClientId, adapter); } } else { return; } } else { return; } if (stopAdapter) { adapter.Stop(); //don't need to remove clients due to stopping applied. } else { //remove clients from the adapter being removed. Guid[] allClientId; lock (adapterOfClients) { allClientId = adapterOfClients.Where(i => i.Value != adapter).Select(i => i.Key).ToArray(); } adapter.RemoveClient(allClientId); } adapter.ConnectionErrorOccurred -= OnAdapterConnectionErrorOccurred; adapter.AdapterStarted -= OnAdapterStarted; adapter.AdapterStopped -= OnAdapterStopped; AdapterRemoved?.Invoke(this, new AdapterEventArgs(adapter)); }