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

Сообщение Re: "Этюд" от 11.10.2023 12:13

Изменено 11.10.2023 12:53 m2user

Re: "Этюд"
HashTable не является thread safe, что проявит себя тем или иным образом (для Dictionary обычно exception) при конкурентном вызове метода Process в разных потоках.
А ещё конкурентный поток может подменять Cache.Storage (объект и контент коллекции).

Поправить вышеуказанную проблему можно например так.
void Process(id)
{
   lock(Cache.Storage) {
       Cache.Populate(id);
    
       // периодически выдает данные для чужих "id" 
       var key = Cache.Storage[Key];
   }
}


Но лучше так:

static class Cache
{
   public static Hashtable { get; } Storage = Hashtable.Synchronized(new Hashtable());

   public static object Populate(int id)
   {      
          var data = GetFromDb(id);
          Storage[Key] = GetFromDb(id);
          return data;      
   }
}


Дополнено: Из кода не вполне ясно, что именно _lock синхронизировал. Возможно GetFromDb. Тогда _lock всё же нужен.
Re: "Этюд"
HashTable не является thread safe, что проявит себя тем или иным образом (для Dictionary обычно exception) при конкурентном вызове метода Process в разных потоках.
А ещё конкурентный поток может подменять Cache.Storage (объект и контент коллекции).

Поправить вышеуказанную проблему можно например так.
void Process(id)
{
   lock(Cache.Storage) {
       Cache.Populate(id);
    
       // периодически выдает данные для чужих "id" 
       var key = Cache.Storage[Key];
   }
}


Но лучше так:

static class Cache
{
   public static Hashtable { get; } Storage = Hashtable.Synchronized(new Hashtable());

   public static void Populate(int id)
   {      
          Storage[Key] = GetFromDb(id);      
   }
}


Дополнено: Из кода не вполне ясно, что именно _lock синхронизировал. Возможно GetFromDb. Тогда _lock всё же нужен.