diff --git a/Cache/PriceCache.cs b/Cache/PriceCache.cs index 7ec6ad8..2c443de 100644 --- a/Cache/PriceCache.cs +++ b/Cache/PriceCache.cs @@ -90,6 +90,7 @@ namespace TradeBlotter.Cache while(threadRun) { Thread.Sleep(quantumInterval); + if(!threadRun)break; quantums+=quantumInterval; if(quantums>cacheRefreshAfter) { diff --git a/Cache/SymbolCache.cs b/Cache/SymbolCache.cs index c71f11b..7d5ff17 100644 --- a/Cache/SymbolCache.cs +++ b/Cache/SymbolCache.cs @@ -16,7 +16,8 @@ namespace TradeBlotter.Cache public class SymbolCache : IDisposable { private List symbolCache=new List(); - private Object thisLock=new Object(); + private readonly Object thisLock=new Object(); + private readonly Object fetchLock = new Object(); private Thread cacheMonitorThread=null; private volatile bool threadRun=true; private int cacheRefreshAfter=60000; // Invalidate cache after @@ -42,31 +43,42 @@ namespace TradeBlotter.Cache symbolCache=new List(); } } + public void Dispose() { lock(thisLock) { if(null==symbolCacheInstance || false==threadRun)return; threadRun=false; - if(null!=cacheMonitorThread) - { - MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[SymbolCache:Dispose]Thread state is {0}. Joining main thread...",Utility.ThreadStateToString(cacheMonitorThread))); - cacheMonitorThread.Join(5000); - cacheMonitorThread=null; - MDTrace.WriteLine(LogLevel.DEBUG,"[SymbolCache:Dispose] End."); - } symbolCacheInstance=null; } + if(null!=cacheMonitorThread) + { + MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[SymbolCache:Dispose]Thread state is {0}. Joining main thread...",Utility.ThreadStateToString(cacheMonitorThread))); + cacheMonitorThread.Join(5000); + cacheMonitorThread=null; + MDTrace.WriteLine(LogLevel.DEBUG,"[SymbolCache:Dispose] End."); + } } public List GetSymbols() { - lock(this) + lock(thisLock) { - if(0==symbolCache.Count)symbolCache=PricingDA.GetSymbols(); - return symbolCache; + if(symbolCache.Count>0)return new List(symbolCache); + } + lock(fetchLock) + { + List symbols = PricingDA.GetSymbols(); + lock(thisLock) + { + if(symbolCache.Count>0)return new List(symbolCache); + symbolCache=new List(symbols); + return new List(symbols); + } } } + private void ThreadProc() { int quantums=0; @@ -74,14 +86,15 @@ namespace TradeBlotter.Cache while(threadRun) { Thread.Sleep(quantumInterval); + if(!threadRun)break; quantums+=quantumInterval; if(quantums>cacheRefreshAfter) { quantums=0; + List symbols = PricingDA.GetSymbols(); lock(thisLock) { -// symbolCache.Clear(); - symbolCache=PricingDA.GetSymbols(); + symbolCache=new List(symbols); } } }