2

我创建了一个单例模式类,其中包含一些填充起来非常昂贵的实例变量(字典)。

此类用于 .NET MVC 4 项目。他们的关键是这个 Singleton 类中的字典提供的数据很好,但不是运行 Web 应用程序所必需的。

换句话说,当我们处理一个 Web 请求时,如果字典中的信息可用,该请求将得到增强,但如果它不可用,那也没关系。

所以我想做的是找到将数据加载到 Singleton 中的这些字典的最佳方法,而不会因为它们充满数据而阻塞 Web 活动。

我通常会找到一种使用多线程的方法,但在过去,我阅读并遇到了在 ASP.NET 中使用多线程技术的问题。.NET 4 / MVC 4 有变化吗?我应该如何处理这个?

更新

根据下面的反馈和更多的研究,我现在正在做的事情如下,它似乎工作正常。有没有人看到任何潜在的问题?在我的测试中,无论我调用多少次 LazySingleton.Instance,构造函数只会被调用一次,并立即返回。我可以立即访问 LazySingleton.EXPENSIVE_CACHE,尽管它可能不包含我正在寻找的值(我在我的应用程序中使用.Contains()调用对其进行测试)。所以它似乎正在工作......

如果我只从单个线程(LazySingleton 构造函数)编辑 EXPENSIVE_CACHE 字典,在我的 Web 应用程序中读取它时是否需要担心线程安全?

public class LazySingleton
{
    public ConcurrentDictionary<string, string> EXPENSIVE_CACHE = new ConcurrentDictionary<string, string>(1, 80000); // writing to cache in only one thread
    private static readonly Lazy<LazySingleton> instance = new Lazy<LazySingleton>(() => new LazySingleton());

    private LazySingleton()
    {
        Task.Factory.StartNew(() => expensiveLoad());
    }

    public static LazySingleton Instance
    {
        get
        {
            return instance.Value;
        }
    }

    private void expensiveLoad()
    {
        // load data into EXPENSIVE_CACHE
    }
}
4

1 回答 1

8

您可以填写您的现金储备库

  1. 应用程序_启动
  2. 会话开始

您的 Web 应用程序事件。
像这样的东西

<%@ Application Language="C#" %>
<script runat="server">
    void Application_Start(object sender, EventArgs e) 
    {
        SingletonCache.LoadStaticCache();
    }
</script>

可能有用吗

于 2013-02-22T21:59:18.833 回答