迭代器塊的延遲加載行爲正在緩存數據中造成困難。想想這個小測試程序:使用緩存迭代器塊結果的最佳做法
class Program
{
static IEnumerable<int> LoadDataFromDatabase()
{
Console.WriteLine("Hitting database....");
yield return 13;
}
static IEnumerable<int> _cachedData = null;
static IEnumerable<int> CachedData
{
get
{
if (_cachedData == null)
{
_cachedData = LoadDataFromDatabase();
}
return _cachedData;
}
}
static void Main(string[] args)
{
Console.WriteLine(string.Format("Collection contains {0} items.", CachedData.Count()));
Console.WriteLine(string.Format("Collection contains {0} items.", CachedData.Count()));
}
}
輸出到這是
擊中數據庫....
集合包含1項。
打數據庫....
集合包含1項。
我想只打一次數據庫(因此緩存),但由於LoadDataFromDatabase()
是一個迭代塊,實際的數據庫調用是什麼緩存 - 而不是數據。
這種情況下的最佳做法是什麼?我應該只是做_cachedData = LoadDataFromDatabase().ToList()
來存儲評估數據?
您期望LoadDataFromDatabase'加載多少數據,它是否需要更改應用程序的生命週期?如果答案有點不變,那麼爲簡單起見,您應該將數據存儲爲列表。 – 2012-08-11 09:52:33
我可以假設,如果我緩存數據,我確實需要整個列表,因此評估整個數據集總是可以的。而且我確實有一套適用於污染數據的機制。我想知道是否'.ToList()'是一種解決懶惰評估的標準方法,或者如果還有更多的建議(例如,有一些屬性我可以放在迭代器塊方法中告訴C#不要懶惰評估)。 – tenfour 2012-08-11 09:54:47
你想緩存smth不要命中數據庫兩次 - 正確嗎? – 2012-08-11 09:59:57