/// <summary> /// get data of an image by specifying its image key /// </summary> /// <param name="key">key of image</param> /// <returns>image data</returns> public byte[] GetImageData(string key) { lock (imagelock) { ImageCacheEntry entry; if (!imagesbykey.TryGetValue(key, out entry)) { entry = new ImageCacheEntry { Image = context.Database.LoadEntities <ImageCacheItem>().Where(i => i.Key == key).Execute().FirstOrDefault(), LifeTime = 300.0 }; images.Add(entry); imagesbyid[entry.Image.ID] = entry; imagesbykey[key] = entry; } RefreshImage(entry); return(entry.Image.Data); } }
void OnTimerElapsed() { lock (imagelock) { for (int i = images.Count - 1; i >= 0; --i) { ImageCacheEntry entry = images[i]; entry.LifeTime -= 1.0; if (entry.LifeTime <= 0) { imagesbyid.Remove(entry.Image.ID); if (!string.IsNullOrEmpty(entry.Image.Key)) { imagesbykey.Remove(entry.Image.Key); } images.RemoveAt(i); } } context.Database.Delete <ImageCacheItem>().Where(i => i.Expiration < DateTime.Now).Execute(); } }
/// <summary> /// get data of an image by specifying its image id /// </summary> /// <param name="imageid">id of image</param> /// <returns>image data</returns> public byte[] GetImageData(long imageid) { lock (imagelock) { ImageCacheEntry entry; if (!imagesbyid.TryGetValue(imageid, out entry)) { entry = new ImageCacheEntry { Image = context.Database.LoadEntities <ImageCacheItem>().Where(i => i.ID == imageid).Execute().FirstOrDefault(), LifeTime = 300.0 }; images.Add(entry); imagesbyid[imageid] = entry; if (!string.IsNullOrEmpty(entry.Image.Key)) { imagesbykey[entry.Image.Key] = entry; } } RefreshImage(entry); return(entry.Image.Data); } }
void RefreshImage(ImageCacheEntry entry) { if (DateTime.Now - entry.Image.LastUpdate < refreshTime) { return; } byte[] data; try { using (WebClient client = new WebClient()) { data = client.DownloadData(entry.Image.URL); } } catch (Exception e) { Logger.Warning(this, $"Unable to refresh image '{entry.Image.URL}'", e.Message); context.Database.Update <ImageCacheItem>().Set(i => i.LastUpdate == DateTime.Now).Where(i => i.ID == entry.Image.ID).Execute(); return; } entry.Image.Data = data; context.Database.Update <ImageCacheItem>().Set(i => i.Data == data, i => i.LastUpdate == DateTime.Now).Where(i => i.ID == entry.Image.ID).Execute(); }