我有一个辛格尔顿应用程序中的对象具有以下属性:
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"] 为空是使用以下语句使用 AllocationActions setter 的时刻:
AllocationActions = new AllocationActionsCollection(Instance.CacheId);
我的问题是:
a)令我震惊的是 HttpContext.Current.Session 不是线程安全的。那么如何安全地使用该财产呢?
b) 你知道为什么 Session 变量可以为空吗(尽管我很确定我在第一次使用它之前设置了它)?
谢谢,帕维尔
EDIT 1:
a) 使用以下语句每 2 分钟设置一次初始化会话变量的行(在 Page_Load 中执行)
AllocationActions = new AllocationActionsCollection(Instance.CacheId);
b) 在事件处理程序中调用调用 getter 的代码(如 Button_Click)
c) 应用程序中没有自定义线程。仅常见的 HTTP 处理程序
A 单例对象是通过将类的实例化限制为一个对象来实现的。
HttpContext.Current.Session
是专用于单个用户的区域;存储在会话中的任何对象仅对创建它的用户/会话可用。
任何存储在Application
仅适用于每个用户/会话。
Any 静态对象此外,仅适用于每个用户/会话。建议实施 http://en.wikipedia.org/wiki/Singleton_pattern总是使用静态对象..为什么不呢?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)