diff --git a/Wino.Mail.ViewModels/Collections/WinoMailCollection.cs b/Wino.Mail.ViewModels/Collections/WinoMailCollection.cs index 47dc51cd..03329bd6 100644 --- a/Wino.Mail.ViewModels/Collections/WinoMailCollection.cs +++ b/Wino.Mail.ViewModels/Collections/WinoMailCollection.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -21,16 +22,16 @@ public class WinoMailCollection : ObservableRecipient, IRecipient MailCopyIdHashSet = []; + public ConcurrentDictionary MailCopyIdHashSet = []; // Cache ThreadIds to quickly find items that should be threaded together - private readonly Dictionary> _threadIdToItemsMap = new(); + private readonly ConcurrentDictionary> _threadIdToItemsMap = new(); // Cache item to group mapping for faster lookups - private readonly Dictionary> _itemToGroupMap = new(); + private readonly ConcurrentDictionary> _itemToGroupMap = new(); // Cache uniqueId to MailItemViewModel for faster GetMailItemContainer lookups - private readonly Dictionary _uniqueIdToMailItemMap = new(); + private readonly ConcurrentDictionary _uniqueIdToMailItemMap = new(); public event EventHandler MailItemRemoved; public event EventHandler ItemSelectionChanged; @@ -112,18 +113,21 @@ public class WinoMailCollection : ObservableRecipient, IRecipient(); @@ -151,7 +156,7 @@ public class WinoMailCollection : ObservableRecipient, IRecipient { _mailItemSource.InsertItem(groupKey, listComparer, mailItem, listComparer); - + // Update item-to-group cache var group = _mailItemSource.FirstGroupByKeyOrDefault(groupKey); if (group != null) @@ -235,9 +240,9 @@ public class WinoMailCollection : ObservableRecipient, IRecipient { group.Remove(mailItem); - + // Remove from item-to-group cache - _itemToGroupMap.Remove(mailItem); + _itemToGroupMap.TryRemove(mailItem, out _); if (group.Count == 0) { @@ -325,7 +330,7 @@ public class WinoMailCollection : ObservableRecipient, IRecipient(groupKey, groupItems); _mailItemSource.AddGroup(groupKey, newGroup); - + // Update item-to-group cache foreach (var item in groupItems) { @@ -579,7 +584,7 @@ public class WinoMailCollection : ObservableRecipient, IRecipient e.MailCopy.UniqueId == uniqueMailId); - + if (singleItemViewModel != null) { _uniqueIdToMailItemMap[uniqueMailId] = singleItemViewModel; @@ -668,7 +673,7 @@ public class WinoMailCollection : ObservableRecipient, IRecipient { @@ -761,7 +766,7 @@ public class WinoMailCollection : ObservableRecipient, IRecipient