private void ParseClient(string aVarName, string value) { var id = Int32.Parse(aVarName.Split('.')[0]); if (id == Id) return; if (value == "") { if (!clients.ContainsKey(id)) return; if (clients[id].Client) { clients[id].Media.UnPublish(); clients[id].Commands.UnPublish(); } Execute.OnUIThread(() => { OnClientRemoved(id); Clients.Remove(id); AllClients.Remove(AllClients.FirstOrDefault(k => k.Id == id)); }); // First call OnClientRemoved before you remove the client. Otherwise you will generate an exception. } else { if (clients.ContainsKey(id)) { clients[id].FromString(value); OnClientChanged(clients[id]); } else { var st = new ImbClientStatus(); st.FromString(value); if (!string.Equals(st.Application, Status.Application, StringComparison.CurrentCultureIgnoreCase) && !string.Equals(st.Application, "*") && !string.Equals(Status.Application, "*")) return; if (st.Client) { st.Media = Imb.Publish(st.Id + ".Media"); st.Commands = Imb.Publish(st.Id + ".Commands"); //st.Positions = Imb.Subscribe(st.Id + ".Position"); //st.Positions.OnNormalEvent += Positions_OnNormalEvent; } Execute.OnUIThread(() => { if (!clients.ContainsKey(id)) { Clients.Add(id, st); AllClients.Add(st); OnClientAdded(st); } else { AllClients.Remove(AllClients.FirstOrDefault(k => k.Id == id)); Clients[id] = st; } }); } } }