示例#1
0
 /// <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);
     }
 }
示例#2
0
 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();
     }
 }
示例#3
0
 /// <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);
     }
 }
示例#4
0
        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();
        }