【发布时间】:2011-12-30 18:43:26
【问题描述】:
我有一个 ASP.NET 2 C# 应用程序,它使用单例从数据库加载大量数据。
这个单例的第一个请求非常慢(正如预期的那样)。随后的速度非常快。有没有在项目建成后立即实例化单例?
【问题讨论】:
标签: c# asp.net singleton build-automation instantiation
我有一个 ASP.NET 2 C# 应用程序,它使用单例从数据库加载大量数据。
这个单例的第一个请求非常慢(正如预期的那样)。随后的速度非常快。有没有在项目建成后立即实例化单例?
【问题讨论】:
标签: c# asp.net singleton build-automation instantiation
没有运行实际应用程序的情况下,无法直接从数据库中填充单例。您可以通过将单例填充到与应用程序的其余部分(在Application_Start 中)的单独线程上来潜在地加速它,但是如果在完全加载之前使用单例(并且还需要添加锁定逻辑)。
您将大量数据从数据库加载到单例中是否有特定原因?
【讨论】:
使用WebActivator 将其创建为 App_Start 配置类。
假设您的应用程序设置为虚拟目录,则 App_Start 中的代码将在构建后立即调用。
请注意,这会使您的构建看起来“缓慢”。另请注意,如果您在此代码期间遇到异常,您实际上会收到“构建失败”,并带有类似于以下内容的神秘错误消息:
Exception has been thrown by the target of an invocation.. ASPRUNTIME ProjectName
这意味着您需要在浏览器中浏览到您的应用才能看到真正的错误消息。
当我们将 EF 迁移绑定到 App_Start 配置时,我们遇到了所有这些问题。
【讨论】:
您可以将用于填充单例的代码放入 global.asax.cs 中的 Application_Start 方法中。
来自MSDN:
在请求 ASP.NET 应用程序中的第一个资源(例如页面)时调用。 Application_Start 方法在应用程序的生命周期中只调用一次。您可以使用此方法执行启动任务,例如将数据加载到缓存中并初始化静态值。
【讨论】: