【发布时间】:2011-09-27 13:02:41
【问题描述】:
我在应用程序中有一个 Singleton 对象,它具有以下属性:
private AllocationActionsCollection AllocationActions
{
get
{
return HttpContext.Current.Session["AllocationOptions.AllocationActions"] as AllocationActionsCollection;
}
set
{
HttpContext.Current.Session["AllocationOptions.AllocationActions"] = value;
}
}
我正在处理一个错误(HttpContext.Current.Session["AllocationOptions.AllocationActions"] 为空,即使我认为它总是设置为有效实例...)。我刚刚在 MSDN 中读到 HttpContext 实例成员不能保证是线程安全的!我想知道这是否可能是问题所在。应用程序中的某处可能存在资源竞争,而 HttpContext.Current.Session["AllocationOptions.AllocationActions"] 为 null 的时刻就是使用此语句使用 AllocationActions 设置器的时刻:
AllocationActions = new AllocationActionsCollection(Instance.CacheId);
我的问题是:
a) 我很震惊 HttpContext.Current.Session 不是线程安全的。那么如何安全地使用该属性呢? b) 你有什么想法为什么 Session 变量可以为空(即使我很确定我在第一次使用它之前就设置了它)?
谢谢,帕维尔
编辑 1:
a) 初始化会话变量的行每 2 分钟使用以下语句设置一次(在 Page_Load 中执行)
AllocationActions = new AllocationActionsCollection(Instance.CacheId);
b) 在事件处理程序中调用 getter 的代码(如 Button_Click)
c) 应用程序中没有自定义线程。唯一常见的 HTTP Handler
【问题讨论】:
-
好的,那么这段代码是什么?这是一个显式线程情况(调用 Thread.Start)还是通过线程这是一个 Web 服务或 HTTP 处理程序,还是什么?
-
什么时候执行返回空会话的代码?在页面构造函数中 Session IS null;在 Page_Init 或 Page_Load 会话中不为空
-
你需要展示更多的源代码——尤其是。在哪里设置并澄清线程情况...例如,如果您在 IIS 中访问 HttpContext.Current 之外的 IIS 线程(即在您单独启动的线程中),这将产生“有趣”的结果...跨度>
-
文档的意思是,一个特定的 HttpContext 实例一次只能从一个线程安全地使用。这是所需的行为,因为它与正在处理页面请求的线程绑定。
标签: c# asp.net multithreading thread-safety httpcontext