.NET 4.x Безопасное обновление Lookup - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Передо мной стоит такая задача: получать с сервера данные и преобразовывать их в Lookup, при этом, будет происходить его "обновление" раз в N секунд/минут. Хотелось бы сделать безопасное обновление этой переменной. Хотел сделать отдельный класс, который будет получать Lookup и хранить его у себя, выдавать данные по нужному ключу и редактировать их. Для синхронизации хотел использовать System.Threading.Timer. И тут вопрос: как мне безопасно "обновить" эту переменную? Хотел сделать как-то так:
class SyncLookup
{
    API api;
    Lookup<string, Data> lookup;
    
    Timer syncTimer;
    AutoResetEvent syncResetEvent = new AutoResetEvent(false);
    bool isUpdate = false;
    
    public SyncLookup(API api, int syncIntervalPerSec)
    {
        this.api = api;
        // ...
 
        if (syncIntervalPerSec > 0)
        {
            syncTimer = new Timer(LookupUpdate, null, 0, syncIntervalPerSec * 1000);
        } else
        {
            LookupUpdate(null);
        }
    }
    
    public async void LookupUpdate(object state)
    {
        Lookup<string, Data> data = null;
        data = await api.GetData();
 
        while (isUpdate)
        {
            syncResetEvent.WaitOne();
        }
 
        isUpdate = true;
        this.lookup = data;
        isUpdate = false;
        syncResetEvent.Set();
    }
    
    public Data GetData(string card_id)
    {
        while (isUpdate)
        {
            syncResetEvent.WaitOne();
        }
 
        if (lookup.Contains(card_id))
        {
            return lookup[card_id].First();
        }
 
        return null;
    }
    
    public async void SetData(int data_id, string param)
    {
        Data Data = /* поиск */;
        
        while (isUpdate)
        {
            syncResetEvent.WaitOne();
        }
 
        isUpdate = true;
        await api.UpdateOldData(data);
        isUpdate = false;
        syncResetEvent.Set();
    }
}
Но решение выглядит очень сильно громозким... Может кто-то поможет и подскажет как решить данную проблему? P.S. шарп и многопоточность знаю достаточно мало, поэтому сильно не ругайтесь

Решение задачи: «.NET 4.x Безопасное обновление Lookup»

textual
Листинг программы
var lookupWrapper = new WrapperLookup();
lookup = await lookupWrapper.getLookupAsync();

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5