1

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

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

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

我知道这种一切都依赖于 HttpContext 的设计很糟糕,但现在改变已经太迟了。查看反射器,我看到 HttpContext 类仅使用静态内部类来获取 ApplicationState。有没有其他方法可以得到它?

.net 中的所有这些内部类真的很烦人。

4

2 回答 2

1

当你开始它时,只需将你喜欢的任何东西传递给你的线程。使用ParameterizedThreadStart委托来启动它,而不仅仅是ThreadStart委托。您可以将 HttpContext.Current 传递给它,或者将您希望线程拥有的信息捆绑在一起,然后传递它。

于 2009-03-23T10:08:24.123 回答
0

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

public static HttpApplicationStateWrapper State { get; private set; }

protected void Application_Start()
{
    State = new HttpApplicationStateWrapper(this.Application);
}

使用 DI 框架来注册这个实例会更合适,但如果你有一个可用的框架,你可能会完全避免使用 Application State 来存储配置。此外,.NET 中有一个配置框架可以直接满足这一需求并提供从任何地方读取配置的能力。

于 2012-01-26T02:37:56.560 回答