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;
        }