.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();