【问题标题】:How do I automatically instantiate a singleton after a build?如何在构建后自动实例化单例?
【发布时间】:2011-12-30 18:43:26
【问题描述】:

我有一个 ASP.NET 2 C# 应用程序,它使用单例从数据库加载大量数据。

这个单例的第一个请求非常慢(正如预期的那样)。随后的速度非常快。有没有在项目建成后立即实例化单例?

【问题讨论】:

    标签: c# asp.net singleton build-automation instantiation


    【解决方案1】:

    没有运行实际应用程序的情况下,无法直接从数据库中填充单例。您可以通过将单例填充到与应用程序的其余部分(在Application_Start 中)的单独线程上来潜在地加速它,但是如果在完全加载之前使用单例(并且还需要添加锁定逻辑)。

    您将大量数据从数据库加载到单例中是否有特定原因?

    【讨论】:

    • @ChrisMarisic "不运行应用程序" - WebActivator 没有绕过这个限制,仍然需要应用程序启动。
    • 如果 App_Start 中的代码随后引发异常,WebActivator 的使用将如何导致 Visual Studio 输出“构建失败”?
    • @ChrisMarisic 不,我的意思是有些东西正在启动您的网络应用程序。编译器不会在 App_Start 中执行代码,它必须在 Web 环境中运行。肯定是某些原因导致您的应用启动。
    • @ChrisMarisic 此外,新版本的 IIS 可以选择让您的网站“始终在线”,这导致立即启动,但几乎可以肯定默认情况下这是关闭的。
    • @ChrisMarisic 是的,我点击它并在 IIS、IIS Express 和 WebDev 服务器中进行了尝试。不确定“直接来自项目二进制文件”是什么意思。
    【解决方案2】:

    使用WebActivator 将其创建为 App_Start 配置类。

    假设您的应用程序设置为虚拟目录,则 App_Start 中的代码将在构建后立即调用。

    请注意,这会使您的构建看起来“缓慢”。另请注意,如果您在此代码期间遇到异常,您实际上会收到“构建失败”,并带有类似于以下内容的神秘错误消息:

    Exception has been thrown by the target of an invocation.. ASPRUNTIME ProjectName

    这意味着您需要在浏览器中浏览到您的应用才能看到真正的错误消息。

    当我们将 EF 迁移绑定到 App_Start 配置时,我们遇到了所有这些问题。

    【讨论】:

    • App_Start 代码不作为构建的一部分运行,它在应用启动时运行。如果您使用开发 Web 服务器(并打开它),它可能会在您重建时自动启动应用程序,但我尚未对此进行测试。
    【解决方案3】:

    可以将用于填充单例的代码放入 global.asax.cs 中的 Application_Start 方法中。

    来自MSDN

    在请求 ASP.NET 应用程序中的第一个资源(例如页面)时调用。 Application_Start 方法在应用程序的生命周期中只调用一次。您可以使用此方法执行启动任务,例如将数据加载到缓存中并初始化静态值。

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      相关资源
      最近更新 更多