1 Commits

Author SHA1 Message Date
01c2516eaa Fix the symbol cache and image cache 2026-02-22 14:04:44 -05:00
2 changed files with 30 additions and 17 deletions

View File

@@ -57,6 +57,7 @@ namespace PortfolioManager.Cache
{ {
lock (thisLock) lock (thisLock)
{ {
DisposeBitmaps();
imageCache = new Dictionary<ImageType, Bitmap>(); imageCache = new Dictionary<ImageType, Bitmap>();
} }
} }
@@ -66,22 +67,30 @@ namespace PortfolioManager.Cache
lock (thisLock) lock (thisLock)
{ {
if (null == imageCacheInstance) return; if (null == imageCacheInstance) return;
List<Bitmap> bitmaps = imageCache.Values.ToList(); DisposeBitmaps();
foreach (Bitmap bitmap in bitmaps)
{
bitmap.Dispose();
}
imageCache = null; imageCache = null;
imageCacheInstance = null; imageCacheInstance = null;
} }
} }
public IImage GetImage(ImageCache.ImageType imageType) private void DisposeBitmaps()
{ {
lock(this) if(null == imageCache)return;
List<Bitmap> bitmaps = imageCache.Values.ToList();
foreach (Bitmap bitmap in bitmaps)
{ {
return imageCache[imageType]; bitmap.Dispose();
} }
} }
public IImage GetImage(ImageType imageType)
{
lock(thisLock)
{
if (imageCache == null)throw new ObjectDisposedException(nameof(ImageCache));
if (!imageCache.TryGetValue(imageType, out var bitmap))throw new KeyNotFoundException($"Image {imageType} not found in cache.");
return bitmap;
}
}
} }
} }

View File

@@ -10,7 +10,8 @@ namespace PortfolioManager.Cache
public class SymbolCache : IDisposable public class SymbolCache : IDisposable
{ {
private List<String> symbolCache=new List<String>(); private List<String> symbolCache=new List<String>();
private Object thisLock=new Object(); private readonly Object thisLock=new Object();
private readonly Object fetchLock = new Object();
private Thread cacheMonitorThread=null; private Thread cacheMonitorThread=null;
private volatile bool threadRun=true; private volatile bool threadRun=true;
private int cacheRefreshAfter=60000; // Invalidate cache after private int cacheRefreshAfter=60000; // Invalidate cache after
@@ -60,12 +61,15 @@ namespace PortfolioManager.Cache
{ {
if(symbolCache.Count>0)return new List<string>(symbolCache); if(symbolCache.Count>0)return new List<string>(symbolCache);
} }
List<String> symbols = PricingDA.GetSymbols(); lock(fetchLock)
lock(thisLock)
{ {
if(symbolCache.Count>0)return new List<string>(symbolCache); List<String> symbols = PricingDA.GetSymbols();
symbolCache=new List<String>(symbols); lock(thisLock)
return new List<string>(symbols); {
if(symbolCache.Count>0)return new List<string>(symbolCache);
symbolCache=new List<String>(symbols);
return new List<string>(symbols);
}
} }
} }
@@ -81,7 +85,7 @@ namespace PortfolioManager.Cache
if(quantums>cacheRefreshAfter) if(quantums>cacheRefreshAfter)
{ {
quantums=0; quantums=0;
List<String> symbols = PricingDA.GetSymbols(); List<String> symbols = PricingDA.GetSymbols();
lock(thisLock) lock(thisLock)
{ {
symbolCache=new List<string>(symbols); symbolCache=new List<string>(symbols);
@@ -90,4 +94,4 @@ namespace PortfolioManager.Cache
} }
} }
} }
} }