Есть обычный словарь (ключ-значение):
Dictionary<int, string> dict
В словарь с частотой в несколько миллисекунд добавляются строки из трёх-пяти потоков (Threads) простым методом присваивания:
dict[i] = "какая-то строка";
Иногда ключ может совпадать, то есть будет не добавление новой строки, а обновление существующей. В интернете
на stackoverflow пишут что вышеуказанная строчка потокобезопасна, поэтому проблем не будет (и действительно я вижу что ошибки в программе не вылетают). Но так как данных много и скорость их обновления высока, то проверить достоверно целостность очень трудно - мало ли, может что и пропускается.
Стали терзать сомнения, открыл
статью Албахари про параллелизм, и он в данном случае рекомендует использовать тип
ConcurrentDictionary для этого вместо обычного
Dictionary (но оговаривает что сие будет медленнее - особенно когда периодически вызывается dict.Count), либо использовать вот такую конструкцию добавления/обновления (говорит что она быстрее в 3 раза):
lock (dict)
{
dict[i] = "что-то";
}
А в
третьем источнике Эндрю Лок рекомендует использовать Interlocked.Exchange.
Чей метод будет лучше в плане обеспечения наилучшей целостности данных и скорости для поставленной задачи? Или может для таких случаев подойдут
in-memory базы данных (вроде как они лучше всего ориентированы на такие многопоточные добавления/обновления)?