Я использую словарь для сбора событий в многопоточном приложении, используя блокировку, когда добавляю событие и не использую его при поиске. Каждый час или около того я запускаю очистку событий старше определенного времени. Очень простой и он работает.Использование LINQ ToDictionary с ConcurrentDictionary
Я хотел бы перейти к ConcurrentDictionary, чтобы удалить блокировки, и я подумал, что мне просто нужно добавить «Concurrent» и изменить Add to TryAdd. Но тогда я понес в ошибке, что LINQ возвращает только ToDictionary. Я могу obviusly не использовать LINQ, но я был любопытным, знаю, есть ли что-то, что я могу сделать, чтобы сохранить его. И что еще важнее, есть ли что-то, что я еще должен рассмотреть, прежде чем переходить на ConcurrentDictionry?
public class messageResult
{
public Result result;
public DateTime receivedTime;
}
public Dictionary<Guid, messageResult> events = new Dictionary<Guid, messageResult>();
lock (events)
{
events = events.Where(p => p.Value.receivedTime >= t).ToDictionary(p => p.Key, p => p.Value);
}
Благодаря
Почему вы не используете 'System.Runtime.Caching.MemoryCache'? –
«* используя блокировку, когда я добавляю событие и ** не использую его ** при поиске одного *« Замки не работают таким образом, вы должны блокировать чтение, чтобы предотвратить запись во время чтения. Однако вы можете делать то, что хотите (разрешить несколько читателей и один писатель), используя вместо этого [ReaderWriterLockSlim] (http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx) это позволит вам иметь много читателей, которые все останавливаются, когда один писатель хочет писать. –
@ L.B спасибо за предложение, но каковы преимущества перед моим общим экземпляром Dictionary? –