我找到了以下代码片段,并想知道Func<object> getObject
属性的用途是什么:
public void InsertCacheItem(string key, Func<object> getObject, TimeSpan duration)
{
try
{
var value = getObject();
if (value == null)
return;
key = GetCacheKey(key);
_cache.Insert(
key,
value,
null,
System.Web.Caching.Cache.NoAbsoluteExpiration,
duration,
System.Web.Caching.CacheItemPriority.Normal,
null);
}
catch { }
}
如何通过传递Func属性来调用此特定函数?
答案 0 :(得分:6)
您可以使用以下内容来表示:
InsertCacheItem("bob", () => "valuetocache", TimeSpan.FromHours(1));
但为什么这样呢?为什么不直接传入&#34; valuetocache&#34;?好吧,主要是由于try..catch
。写入的代码意味着即使Func
无法执行,调用代码也不会受到影响。
所以:
InsertCacheItem("bob", () => MethodThatThrowsException(), TimeSpan.FromHours(1));
例如,仍然有用。 它不会缓存任何内容,但它不会冒出调用代码的异常。
答案 1 :(得分:1)
对于上面的代码,除了捕获异常之外,它实际上几乎没有意义。您通常会在函数中看到这一点,以从缓存中检索某些内容。例如:
public object GetCacheItem(string key, Func<object> getObject, TimeSpan duration)
{
var value = GetItemFromCache(key);
if (value == null)
{
value = getObject();
_cache.Insert(
key,
value,
null,
System.Web.Caching.Cache.NoAbsoluteExpiration,
duration,
System.Web.Caching.CacheItemPriority.Normal,
null);
}
return value;
}
现在我们可以从缓存中检索,否则我们会调用潜在的昂贵操作来再次创建值。例如:
var listOfZombies = GetCacheItem(
"zombies",
() => GetZombiesFromDatabaseWhichWillTakeALongTime(),
TimeSpan.FromMinutes(10));