我有一個方法(完全服務於請求)的一個簡短的鎖保護部分,使所有初始化(等與日誌相關)。因此,只有1個線程可以在那裏。在本節中,我還會從數據庫加載系統數據(如果未加載)。這自然只在第一次請求時執行,不需要花費時間,並且沒有線程可以傳播,因爲它只執行一次(通過虛擬請求)。在asmx Web服務中爲數據庫IO生成線程的正確方法是什麼?
static public void LoadAllSystemData() { SystemData newData = new SystemData(); //own type (etc. Hashtables in Hashtables). LoadTables(ref newData); LoadClasses(ref newData); LoadAllSysDescrs(ref newData); LoadFatFields(ref newData); LoadAllFields(ref newData); _allData = newData; }
鎖止守衛部分中的系統數據被從併發線程僅通過讀訪問,並且不需要鎖之後:
static public Hashtable GetTables() { return _allData.Tables; }
現在鎖保護部必須有方法,如果系統中的數據,檢查比24小時更新並刷新它。如果僅通過調用方法(從鎖保護部分)完成該線程需要很長時間,並且沒有其他線程可以進入鎖保護部分。
static public void CheckStatus() { DateTime timeStamp = DateTime.Now; TimeSpan span = timeStamp.Subtract(_cacheTimeStamp); if (span.Hours >= 24) { LoadAllSystemData(); _cacheTimeStamp = DateTime.Now; } }
我的問題是:
如何產卵處理IO所以線程池工作線程可以傳播非線程池線程最好的方式,所有的線程花費最少的時間在鎖保護區?
是_allData = newData;在LoadAllSystemData原子?如果是這樣,那感覺是最好的實現方式,所以像GetTables這樣的GetXxx方法不需要任何鎖定!
有什麼辦法可以在請求之前調用LoadAllSystemData?例如在iisreset上?
在此先感謝您的答案!
感謝您的優秀回答。我有一些限制,我不會按照你建議的路徑(關於緩存和權威/監視)。兩者都是我一無所知的東西(現在我做!),也許會用在其他項目。 –