如何在Singleton进行昂贵的手术而不等待

本文关键字:等待 Singleton | 更新日期: 2023-09-27 18:00:43

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

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

换句话说,当我们处理web请求时,如果字典中的信息可用,则会使用这些信息来增强请求,但如果不可用,则没关系。

因此,我想做的是找到最好的方法将数据加载到Singleton中的这些Dictionary中,而不会因为它们充满了数据而阻止网络活动。

我通常会找到一种使用多线程的方法来实现这一点,但在过去,我读到关于在ASP.NET中使用多线程技术的文章时遇到了问题。.NET 4/MVC 4中的情况发生了变化吗?我应该如何处理?

更新

根据下面的反馈和更多的研究,我现在正在做的事情在下面,看起来效果不错。有人看到任何潜在的问题吗?在我的测试中,无论我调用LazySingleton.Instance多少次,构造函数都只被调用一次,并立即返回。我可以立即访问LazySingleton.EXPENSIVE_ACHE,尽管它可能不包含我要查找的值(我使用.Contains()调用在应用程序中测试这些值)。所以它似乎在起作用。。。

如果我只从一个线程(LazySingleton构造函数)编辑EXPENSIVE_CACHE Dictionary,那么在我的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
    }
}

如何在Singleton进行昂贵的手术而不等待

您可以在任何上填写您的现金存储库

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

您的web应用程序事件。
像这样的

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

这可能是有用的