C# 在iis网站中缓存全局数据
我有一个只读对象图,它被缓存了一分钟,以便所有线程都可以使用它(下面的代码)C# 在iis网站中缓存全局数据,c#,multithreading,iis,caching,C#,Multithreading,Iis,Caching,我有一个只读对象图,它被缓存了一分钟,以便所有线程都可以使用它(下面的代码) 但是我想知道:当我更容易将只读对象存储为静态对象时,为什么要使用缓存对象。这将存储一个指向堆的指针,因此当它被更新时,仍在处理前一个指针对象的线程将对旧对象进行处理,而且在返回之前,我不必从缓存中强制转换该对象。有人看到任何问题吗?在应用程序变量中放置storeLock您是否在新线程中调用此方法?italic@FarzinZaker我没有执行任何显式线程,但IIS本身是高度多线程的,因此我希望确保不会出现任何问题。\
但是我想知道:当我更容易将只读对象存储为静态对象时,为什么要使用缓存对象。这将存储一个指向堆的指针,因此当它被更新时,仍在处理前一个指针对象的线程将对旧对象进行处理,而且在返回之前,我不必从缓存中强制转换该对象。有人看到任何问题吗?在应用程序变量中放置
storeLock
您是否在新线程中调用此方法?italic@FarzinZaker我没有执行任何显式线程,但IIS本身是高度多线程的,因此我希望确保不会出现任何问题。\ italic您需要澄清这一点。我的意思是关注使用System.Web.Caching.Cache是否毫无意义(而是将对象存储在静态文件中)。我认为锁定策略是一个很好的最佳实践。您的锁定策略工作得很好,但当您有多个iis工作进程时就不行了。在这种情况下,您需要将锁放在应用程序变量中,以使其足够安全。只需使用应用程序[“StoreLock”]
public class ObjectGraphCache
{
static readonly Object storeLock = new object();
public ObjectGraph AllForElection(int ElectionId, System.Web.Caching.Cache cache)
{
string key=string.Format("AllForElection{0}",
ElectionId);
int timout = int.Parse(ConfigurationManager.AppSettings["dbCacheTimeInSeconds"]);
if (timout == 0)
{
ObjectGraph graph = new ObjectGraph();
graph.AllForElection(ElectionId);
return graph;
}
else
{
Object obj = cache[key];
if (obj == null)
{
lock (storeLock)
{
obj = cache[key]; // In case another page got the lock first and your are queued (Ensures only one get per cycle)
if (obj == null)
{
// Not in cache
ObjectGraph graph = new ObjectGraph();
graph.AllForElection(ElectionId);
cache.Insert(
key,
graph,
null,
DateTime.Now.Add(new TimeSpan(0, 0, timout)),
System.Web.Caching.Cache.NoSlidingExpiration);
return graph;
}
}
}
return (ObjectGraph)obj;
}