///<summary> ///</summary> ///<param name="client"></param> ///<param name="symbol"></param> ///<exception cref="DataFeedException"></exception> public void UnSubscribe(IDataFeedClient client, string symbol) { lock (_rtClients) { List <IDataFeedClient> symbolClients; if (!_rtClients.TryGetValue(symbol, out symbolClients)) { throw new DataFeedException("Attempt to unsubscribe from non-existent symbol: " + symbol); } int clientIndex = symbolClients.FindIndex(feedClient => feedClient.ClientId == client.ClientId); if (clientIndex == -1) { throw new DataFeedException("Attept to unsubscribe non-existent client: " + client.ClientId); } symbolClients.RemoveAt(clientIndex); Debug.Assert(symbolClients.Count(feedClient => feedClient.ClientId == client.ClientId) == 0); //if symbol has no more clients, remove symbol subscription if (symbolClients.Count == 0) { //make the real un-subscribe at data provider UnSubscribeFromSymbol(symbol); //remove from map _rtClients.Remove(symbol); } } }
///<summary> ///</summary> ///<param name="client"></param> ///<param name="symbol"></param> public void Subscribe(IDataFeedClient client, string symbol) { lock (_rtClients) { List <IDataFeedClient> symbolClients; if (!_rtClients.TryGetValue(symbol, out symbolClients)) { //symbol wasn't subscribed yet, create an entry _rtClients.Add(symbol, symbolClients = new List <IDataFeedClient>()); //make the real subscription SubscribeToSymbol(symbol); } //add client to the client list if (symbolClients.FindIndex(feedClient => feedClient.ClientId == client.ClientId) == -1) { symbolClients.Add(client); } } }