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); } } }