gpt4 book ai didi

asp.net - 每个请求隔离 Global.asax 中的共享/静态变量?

转载 作者:行者123 更新时间:2023-12-03 23:09:19 24 4
gpt4 key购买 nike

我有一些 ASP.NET Web 服务,它们都共享一个通用的帮助器类,它们只需要为 每个服务器 实例化一个实例。它用于简单的数据转换,但在启动期间确实会花费一些时间从 web.config 文件等加载内容。帮助程序类是 100% 线程安全的。将其视为一个简单的实用程序调用库。我会在类上共享所有方法,但我想从 web.config 加载初始配置。 我们已经将 Web 服务部署到 IIS 6.0 并使用应用程序池和 Web 花园15名 worker 。

我在 Global.asax 中将 helper 类声明为 Private Shared 变量,并添加了一个延迟加载 Shared ReadOnly 属性,如下所示:

Private Shared _helper As MyHelperClass

Public Shared ReadOnly Property Helper() As MyHelperClass
Get
If _helper Is Nothing Then
_helper = New MyHelperClass()
End If
Return _helper
End Get
End Property

我在 MyHelperClass() 的构造函数中记录了代码,它显示了为每个请求运行的构造函数,即使在同一线程上也是如此。我确信我只是遗漏了 ASP.NET 的一些关键细节,但 MSDN 并不是很有帮助。

我已经尝试使用 Application("Helper")Cache("Helper") 做类似的事情,但我仍然看到构造函数随每个请求一起运行。

最佳答案

您可以将您的助手置于应用程序状态。在 global.asax 中执行此操作:

  void Application_Start(object sender, EventArgs e)
{
Application.Add("MyHelper", new MyHelperClass());
}

您可以这样使用助手:

  MyHelperClass helper = (MyHelperClass)HttpContext.Current.Application["MyHelper"];
helper.Foo();

这会导致在应用程序启动时创建并处于应用程序状态的 MyHelperClass 类的单个实例。由于实例是在 Application_Start 中创建的,因此每个 HttpApplication 实例只会发生一次,而不是每个请求。

关于asp.net - 每个请求隔离 Global.asax 中的共享/静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com