コード例 #1
0
ファイル: IconService.cs プロジェクト: danantal/Catapult
        private void ProcessQueue()
        {
            foreach (IconRequest request in _queue.GetConsumingEnumerable())
            {
                try
                {
                    if (request.Model.Disposed)
                    {
                        continue;
                    }

                    IIndexable targetItem = request.Model.TargetItem;
                    var        cacheKey   = $"{targetItem.GetType()}: {targetItem.Name}";

                    BitmapSource source;
                    if (_iconCache.TryGetValue(cacheKey, out source))
                    {
                        request.Model.Icon = source;
                        continue;
                    }

                    IIconResolver iconResolver = targetItem.GetIconResolver();

                    using (Icon icon = iconResolver?.Resolve())
                    {
                        if (icon == null)
                        {
                            continue;
                        }

                        using (Bitmap bmp = icon.ToBitmap())
                        {
                            var stream = new MemoryStream();
                            bmp.Save(stream, ImageFormat.Png);

                            BitmapFrame bitmapSource = BitmapFrame.Create(stream);
                            _iconCache[cacheKey] = bitmapSource;
                            request.Model.Icon   = bitmapSource;
                        }
                    }
                }
                catch (Exception ex)
                {
                    Log.Error(ex, "Icon resolve failed for {Name}.", request.Model.Name);
                }
            }
        }