/// <summary> /// Получить данные из кэша. /// </summary> /// <typeparam name="T">Типа данных</typeparam> /// <param name="soapMethod">Сервис для получения новых данных</param> /// <param name="server">Сервер для подключения</param> /// <returns>Данные</returns> public T GetData <T>(SOAP1C.SOAPMethod <T> soapMethod, string server) where T : ISOAPData { string itemType = typeof(T).ToString(); UpdateInfo updateInfo = UpdateInfoByServer(server, soapMethod.AdditionKey, itemType); if (updateInfo == default) { AddNewCache(soapMethod, server); } updateInfo = UpdateInfoByServer(server, soapMethod.AdditionKey, itemType); if (updateInfo.Time.AddSeconds(_UpdateIntervalInSeconds) < DateTime.Now && !updateInfo.Updating) { lock (_ProxyData[updateInfo]) { updateInfo.Updating = true; UpdateCache(soapMethod, server, updateInfo); updateInfo.Updating = false; } } T result; lock (_LockCopy) { result = (T)_ProxyData[updateInfo].Clone(); } return(result); }
/// <summary> /// Обновить данные кэша /// </summary> /// <param name="soapMethod">Соап метод</param> /// <param name="server">Сервер</param> /// <param name="updateInfo">Обновляемый кэш</param> private void UpdateCache <T>(SOAP1C.SOAPMethod <T> soapMethod, string server, UpdateInfo updateInfo) where T : ISOAPData { T data = soapMethod.GetData(server); updateInfo.Time = DateTime.Now; lock (_LockCopy) { _ProxyData[updateInfo] = data; } }
/// <summary> /// Добавить в кэш новую запись /// </summary> /// <param name="soapMethod">Соап метод</param> /// <param name="server">Сервер</param> private void AddNewCache <T>(SOAP1C.SOAPMethod <T> soapMethod, string server) where T : ISOAPData { T data = soapMethod.GetData(server); UpdateInfo updateInfo = new UpdateInfo() { Server = server, AdditionKey = soapMethod.AdditionKey, Time = DateTime.Now, Type = typeof(T).ToString() }; lock (_LockCopy) { _ProxyData.Add(updateInfo, data); } }