2009-04-08 82 views
0

我有一个对象在我的数据访问层(DAL)的内存缓存中处理,我需要在线程间持久化它。从我读过的最好的方法是使用httpcontext.item的代码如下所示:如何在不使用httpcontext.items的情况下在线程之间保持对象?

Shared Property DALList() As Dictionary(Of String, DAL) 
     Get 
      If Not Web.HttpContext.Current.Items.Contains("_DALList") Then 
       Web.HttpContext.Current.Items.Add("_DALList", New Dictionary(Of String, DAL)) 
      End If 
      Return Web.HttpContext.Current.Items("_DALList") 
     End Get 
     Set(ByVal value As Dictionary(Of String, DAL)) 
      If Not Web.HttpContext.Current.Items.Contains("_DALList") Then 
       Web.HttpContext.Current.Items.Add("_DALList", value) 
      Else 
       Web.HttpContext.Current.Items("_DALList") = value 
      End If 
     End Set 
    End Property 

两个问题:这种试图序列化对象,如果是的话我怎么得到它离开该对象不变只是在内存中引用它而不是序列化它?我需要保持对象完整,因为它处理数据库连接和缓存下的封面。

[编辑]

当我运行此我得到的是导致页面挂一个错误。事件日志中有两个项目。

错误的应用程序程序w3wp.exe,版本7.0.6001.18000,时间戳0x47919ed8,错误模块kernel,版本6.0.6001.18000,时间戳0x4791ada5,异常代码0xe053534f,故障偏移0x000000000002649d,进程ID为0x%9,应用程序启动时间0x%10。

状态服务器已关闭超时的TCP/IP连接。客户端的IP地址是127.0.0.1。过期的Read操作从04/07/2009 20:44:29开始。

然后,我重新编码将项目放入字典对象的会话ID,我得到这些smae错误。如果我使用静态变量,它工作正常,但我有我的原始问题,即用户将访问其他用户的数据(显然这不是一个选项)。

的重新散列版本是如下:(这适用于第一种方法,但不是这一个)

Shared _CurrentScope As New Dictionary(Of String, DALScope) 
Public Shared Property CurrentScope() As DALScope 
    Get 
     If Not _CurrentScope.ContainsKey(Web.HttpContext.Current.Session.SessionID & "_CurrentScope") Then 
      _CurrentScope.Add(Web.HttpContext.Current.Session.SessionID & "_CurrentScope", New DALScope) 
     End If 
     Return _CurrentScope(Web.HttpContext.Current.Session.SessionID & "_CurrentScope") 
    End Get 
    Set(ByVal value As DALScope) 
     If Not _CurrentScope.ContainsKey(Web.HttpContext.Current.Session.SessionID & "_Currentscope") Then 
      _CurrentScope.Add(Web.HttpContext.Current.Session.SessionID & "_Currentscope", value) 
     Else 
      _CurrentScope(Web.HttpContext.Current.Session.SessionID & "_Currentscope") = value 
     End If 
    End Set 
End Property 

[编辑]

好点onthe的情况下锁定,其中疗法是在同一届会议上不止一次网络请求。我结束了使用httpcontext.item的方法,发现我的问题与属性是一个byval而不是byref。我已经改变了我的代码,包括通过ref处理对象的方法,现在它可以工作。

回答

2

HttpContext在单个请求的生存期内存在。我在这里假设您正在讨论维持多个请求的状态。如果是这样HttpContext.Items不是你想要的。你会想使用应用程序缓存或其他缓存机制。

作为一个附注将项目放入HttpContext.Items不会序列化它。如果使用缓存序列化取决于是否有缓存的后备存储,但由于这是缓存特定的,因此它取决于您选择的缓存。

编辑

我的理解是,它返回到你投入系统中的同一个实例的引用。我使用HttpContext来存储我的nHibernate会话,其中有很多东西。作品神话般。

+0

我只需要一个请求期间的对象。然而,现在我已经将它放入集合中,它无法正常工作。该集合是否返回对象(byval)或对象本身(byref)的副本? – Middletone 2009-04-08 00:22:08

0

正如Josh已经提到的,如果你想在单个请求期间缓存,那么httpcontext.items是要走的路。如果这不起作用,那么你一定是做错了,你究竟在哪里添加数据到httpcontext.items?我通常使用httpmodule并将数据添加到begin_request处理程序中,但这一切取决于您正在尝试执行的操作。

0

我可能是错的,但我没有看到任何锁定已实现,您可能会遇到各种各样的问题如果/当许多线程尝试创建/使用/更改对象时。

相关问题