.NET 4.x Безопасное обновление Lookup - C#
Формулировка задачи:
Здравствуйте.
Передо мной стоит такая задача: получать с сервера данные и преобразовывать их в Lookup, при этом, будет происходить его "обновление" раз в N секунд/минут. Хотелось бы сделать безопасное обновление этой переменной.
Хотел сделать отдельный класс, который будет получать Lookup и хранить его у себя, выдавать данные по нужному ключу и редактировать их. Для синхронизации хотел использовать System.Threading.Timer. И тут вопрос: как мне безопасно "обновить" эту переменную?
Хотел сделать как-то так:
Но решение выглядит очень сильно громозким... Может кто-то поможет и подскажет как решить данную проблему?
P.S. шарп и многопоточность знаю достаточно мало, поэтому сильно не ругайтесь
Листинг программы
- 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();
- }
- }
Решение задачи: «.NET 4.x Безопасное обновление Lookup»
textual
Листинг программы
- var lookupWrapper = new WrapperLookup();
- lookup = await lookupWrapper.getLookupAsync();
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д