在没有HttpContext的情况下在asp.net中获取应用程序状态

在没有HttpContext的情况下在asp.net中获取应用程序状态,asp.net,multithreading,httpcontext,httpapplication,Asp.net,Multithreading,Httpcontext,Httpapplication,我有一个在ApplicationState中存储配置对象的webapp。 此对象包含到数据库的连接字符串以及其他内容 有时我启动一个异步线程来执行一些长时间运行的任务,比如发送电子邮件和更新数据库 但是,由于该线程没有HttpContext,因此无法获取配置对象 我知道这种一切都依赖于HttpContext的设计很糟糕,但现在改变已经太迟了。 查看reflector,我看到HttpContext类只是使用一个静态内部类来获取ApplicationState。还有别的办法吗 net中的所有内部类都

我有一个在ApplicationState中存储配置对象的webapp。 此对象包含到数据库的连接字符串以及其他内容

有时我启动一个异步线程来执行一些长时间运行的任务,比如发送电子邮件和更新数据库

但是,由于该线程没有HttpContext,因此无法获取配置对象

我知道这种一切都依赖于HttpContext的设计很糟糕,但现在改变已经太迟了。 查看reflector,我看到HttpContext类只是使用一个静态内部类来获取ApplicationState。还有别的办法吗


net中的所有内部类都非常烦人。

只要在启动线程时将您喜欢的内容传递给线程即可。使用委托来启动它,而不仅仅是委托。您可以将其传递给HttpContext.Current,或者将您希望线程拥有的信息捆绑在一起,然后传递给它。

只要在启动线程时将您喜欢的内容传递给线程即可。使用委托来启动它,而不仅仅是委托。您可以将其传递给HttpContext.Current,或者将希望线程拥有的信息捆绑在一起,然后传递。

如果您确实需要从异步处理程序访问应用程序状态(或类似),则应修改
HttpApplication
子类(例如Global.asax)以存储应用程序状态实例(
this.Application
)在
Application\u启动期间将其添加到静态属性:

public static HttpApplicationStateWrapper State { get; private set; }

protected void Application_Start()
{
    State = new HttpApplicationStateWrapper(this.Application);
}
使用DI框架来注册此实例更合适,但如果您有一个可用的DI框架,则可以完全避免使用应用程序状态来存储配置。此外,.NET中有一个配置框架可以直接满足此需求,并提供从任何位置读取配置的能力。

如果您确实需要从异步处理程序访问应用程序状态(或类似),则应修改
HttpApplication
子类(例如Global.asax),以便在
应用程序启动期间将应用程序状态实例(
this.Application
)存储到静态属性中:

public static HttpApplicationStateWrapper State { get; private set; }

protected void Application_Start()
{
    State = new HttpApplicationStateWrapper(this.Application);
}
使用DI框架来注册此实例更合适,但如果您有一个可用的DI框架,则可以完全避免使用应用程序状态来存储配置。此外,.NET中有一个配置框架可以直接满足此需求,并提供从任何位置读取配置的能力