Информация об изменениях

Сообщение Re[3]: "Этюд" от 11.10.2023 15:13

Изменено 11.10.2023 15:14 karbofos42

Re[3]: "Этюд"
Здравствуйте, 尿컙拋㕪⬎⤇Ǥ꧃푙刾ꄔ൒, Вы писали:

尿Ǥ푙>Попробуем, спасибо. Process(id) часто вызывается из Parallel.ForEach — так что очень похоже на причину и чем лочить это все, скорее всего проще переделать на ConcurrentDictionary.


тут нужен либо lock на весь Process(id) либо выкидывать ненужную операцию записи в ненужный словарь и одним махом брать данные из БД.
Просто поменять Hashtable на ConcurrentDictionary и выкинуть lock — останется то же самое, что было.
ConcurrentDictionary отдельные операции записи и чтения никак волшебным образом не синхронизирует.
Так же сначала один поток вызовет Populate(1) и запишет данные в словарь.
Потом второй поток вызовет Populate(2) и перепишет данные в словаре на свои.
Потом первый поток проснётся и через Storage[Key] получит не данные для id == 1, а то, что записал второй поток для id == 2.
Re[3]: "Этюд"
Здравствуйте, 尿컙拋㕪⬎⤇Ǥ꧃푙刾ꄔ൒, Вы писали:

尿Ǥ푙>Попробуем, спасибо. Process(id) часто вызывается из Parallel.ForEach — так что очень похоже на причину и чем лочить это все, скорее всего проще переделать на ConcurrentDictionary.


тут нужен либо lock на весь Process(id), либо выкидывать ненужную операцию записи в ненужный словарь и одним махом брать данные из БД.
Просто поменять Hashtable на ConcurrentDictionary и выкинуть lock — останется то же самое, что было.
ConcurrentDictionary отдельные операции записи и чтения никак волшебным образом не синхронизирует.
Так же сначала один поток вызовет Populate(1) и запишет данные в словарь.
Потом второй поток вызовет Populate(2) и перепишет данные в словаре на свои.
Потом первый поток проснётся и через Storage[Key] получит не данные для id == 1, а то, что записал второй поток для id == 2.