diff --git a/PortfolioManager/Cache/SymbolCache.cs b/PortfolioManager/Cache/SymbolCache.cs index 878f961..f6c584c 100644 --- a/PortfolioManager/Cache/SymbolCache.cs +++ b/PortfolioManager/Cache/SymbolCache.cs @@ -36,31 +36,39 @@ namespace PortfolioManager.Cache symbolCache=new List(); } } + public void Dispose() { lock(thisLock) { - if(null==symbolCacheInstance || false==threadRun)return; + 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); + } + 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; @@ -68,13 +76,15 @@ namespace PortfolioManager.Cache while(threadRun) { Thread.Sleep(quantumInterval); + if(!threadRun)break; quantums+=quantumInterval; if(quantums>cacheRefreshAfter) { quantums=0; + List symbols = PricingDA.GetSymbols(); lock(thisLock) { - symbolCache=PricingDA.GetSymbols(); + symbolCache=new List(symbols); } } }