コード例 #1
0
        /// <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));
        }