Как мне синхронизировать 2 ConcurrentDictionaries?

Мне нравится операция без блокировки ConcurrentDictionary и я использую ее в двух объектах:

 ConcurrentDictionary<datetime,myObj> myIndexByDate
 ConcurrentDictionary<myObjSummary, ConcurrentDictionary<int, myObj> myObjectSummary Index

Эти два объекта должны оставаться в синхронизации. Единственный способ сделать это - использовать блокировку, избегая при этом всех преимуществ словаря Concurrent?

2 ответа

Решение

Я хотел бы создать собственный класс с 2 словарями и использовать блокировку только для методов, которые могут изменить словарь (Add, Delete).

Вы не потеряете преимущества параллельного словаря, так как этот метод требует гораздо меньше кода, чем то, что вы должны были бы сделать, используя обычный словарь.

ConcurrentDictionary является "потокобезопасным" только для операций в конкретном экземпляре. Например, пока вызывается вызов ConcurrentDictionary.TryAdd(), никакие другие потоки не могут изменять коллекцию...

Это не означает, что хотя вы получаете значение из одного словаря и добавляете его в другой словарь, значение сохраняется в исходном словаре, пока вы добавляете его во второй.

Вероятно, у вас есть инвариант, который указывает, что при перемещении одного значения из одного словаря в другой, никакие значения в исходном словаре не могут быть удалены (или, по крайней мере, это значение, но это немного труднее гарантировать с помощью ConncurrentDictionary.

Другие вопросы по тегам