CSharp - C# HttpContext类及其线程安全

  显示原文与译文双语对照的内容

我在应用程序中有一个 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.Current.Session ["AllocationOptions.AllocationActions"] 为空的时刻是使用这里语句使用setter的时间:


AllocationActions = new AllocationActionsCollection(Instance.CacheId);



我的问题是:

a ) 我很惊讶 HttpContext.Current.Session 不是线程安全的。 如何安全地使用该属性? 你是否知道会话变量可以为空( 尽管我确信在第一次使用它之前我正在设置它)?

谢谢,Pawel

编辑 1:

a ) 用以下语句( 在Page_Load中执行) 每 2分钟设置会话变量的行。


AllocationActions = new AllocationActionsCollection(Instance.CacheId);



在事件处理程序( 如 Button_Click ) 中调用调用getter的代码

c ) 应用程序中没有自定义线程处理。 仅通用的HTTP处理程序

时间: 原作者:

将类实例化为一个对象,实现了一个收费的单对象。

HttpContext.Current.Session 是专用于单个用户的区域;存储在会话中的任何对象只对创建它的用户/会话可用。

存储在 Application 中的任何对象只对每个用户/会话都可用。

任何收费的对象也只能用于每个用户/会话。 建议的实现总是使用 static 对象。 为什么你不?

原作者:
...