private void SendContacts() { List <HidContactInfo> contactsToSend = new List <HidContactInfo>(); lock (lockCurrentContacts) { while (currentContacts.Count > 0) { HidContactInfo contactInfo = currentContacts.Dequeue(); HidContactInfo lastContact; if (lastContactInfo.TryGetValue(contactInfo.Id, out lastContact)) { if (contactInfo.State == HidContactState.Updated && lastContact.State == HidContactState.Removing) { continue; } } lastContactInfo[contactInfo.Id] = contactInfo; contactsToSend.Add(contactInfo); } } contactsToSend.AddRange(lastContactInfo.Values.Except(contactsToSend, comparer).Where(c => c.State == HidContactState.Updated).ToList()); if (contactsToSend.Count > 0) { SendContacts(contactsToSend); } foreach (ushort id in lastContactInfo.Values.Where(c => c.State == HidContactState.Removed).Select(c => c.Id).ToList()) { lastContactInfo.Remove(id); } foreach (HidContactInfo contactInfo in lastContactInfo.Values.Where(c => c.State == HidContactState.Removing).ToList()) { Enqueue(new HidContactInfo(HidContactState.Removed, contactInfo.Contact)); } foreach (HidContactInfo contactInfo in lastContactInfo.Values.Where(c => c.State == HidContactState.Adding).ToList()) { Enqueue(new HidContactInfo(HidContactState.Updated, contactInfo.Contact)); } }