如何在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
}
}
您可以在任何上填写您的现金存储库
- 应用程序启动
- 会话_启动
您的web应用程序事件。
像这样的
<%@ Application Language="C#" %>
<script runat="server">
void Application_Start(object sender, EventArgs e)
{
SingletonCache.LoadStaticCache();
}
</script>
这可能是有用的