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

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

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

Здравствуйте. Передо мной стоит такая задача: получать с сервера данные и преобразовывать их в Lookup, при этом, будет происходить его "обновление" раз в N секунд/минут. Хотелось бы сделать безопасное обновление этой переменной. Хотел сделать отдельный класс, который будет получать Lookup и хранить его у себя, выдавать данные по нужному ключу и редактировать их. Для синхронизации хотел использовать System.Threading.Timer. И тут вопрос: как мне безопасно "обновить" эту переменную? Хотел сделать как-то так:
Листинг программы
  1. class SyncLookup
  2. {
  3. API api;
  4. Lookup<string, Data> lookup;
  5. Timer syncTimer;
  6. AutoResetEvent syncResetEvent = new AutoResetEvent(false);
  7. bool isUpdate = false;
  8. public SyncLookup(API api, int syncIntervalPerSec)
  9. {
  10. this.api = api;
  11. // ...
  12. if (syncIntervalPerSec > 0)
  13. {
  14. syncTimer = new Timer(LookupUpdate, null, 0, syncIntervalPerSec * 1000);
  15. } else
  16. {
  17. LookupUpdate(null);
  18. }
  19. }
  20. public async void LookupUpdate(object state)
  21. {
  22. Lookup<string, Data> data = null;
  23. data = await api.GetData();
  24. while (isUpdate)
  25. {
  26. syncResetEvent.WaitOne();
  27. }
  28. isUpdate = true;
  29. this.lookup = data;
  30. isUpdate = false;
  31. syncResetEvent.Set();
  32. }
  33. public Data GetData(string card_id)
  34. {
  35. while (isUpdate)
  36. {
  37. syncResetEvent.WaitOne();
  38. }
  39. if (lookup.Contains(card_id))
  40. {
  41. return lookup[card_id].First();
  42. }
  43. return null;
  44. }
  45. public async void SetData(int data_id, string param)
  46. {
  47. Data Data = /* поиск */;
  48. while (isUpdate)
  49. {
  50. syncResetEvent.WaitOne();
  51. }
  52. isUpdate = true;
  53. await api.UpdateOldData(data);
  54. isUpdate = false;
  55. syncResetEvent.Set();
  56. }
  57. }
Но решение выглядит очень сильно громозким... Может кто-то поможет и подскажет как решить данную проблему? P.S. шарп и многопоточность знаю достаточно мало, поэтому сильно не ругайтесь

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

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

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут