.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();
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д