如何在不使用httpcontext.items的情况下在线程之间保留对象?

时间:2009-04-08 00:11:56

标签: asp.net multithreading httpcontext

我有一个对象来处理我的数据访问层(DAL)的内存缓存,我需要在线程之间保持它。根据我的阅读,首选方法是使用httpcontext.item,代码如下:

   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,错误模块kernel32.dll,版本6.0.6001.18000,时间戳0x4791ada5,异常代码0xe053534f,错误偏移0x000000000002649d,进程ID 0x%9,应用程序启动时间0X%10

状态服务器已关闭过期的TCP / IP连接。客户端的IP地址为127.0.0.1。过期的Read操作于2009年7月4日20:44:29开始。

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

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

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

[编辑]

关于在同一会话下不止一个webrequest的情况下锁定的好点。我最终使用httpcontext.item方法,发现我的问题与属性有关,而不是byref。我已经改变了我的代码,以包含通过ref处理对象的方法,现在这可行。

3 个答案:

答案 0 :(得分:2)

HttpContext存在于单个请求的生命周期内。我假设你在线程中讨论的是在多个请求中保持状态。如果是这样HttpContext.Items不是你想要的。您可能希望使用Application Cache或其他一些缓存机制。

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

修改

我的理解是它返回对您放入系统的同一个实例的引用。我使用HttpContext存储我的nHibernate会话,其中有很多东西。工作很棒。

答案 1 :(得分:0)

正如乔希已经提到的,如果你想在单个请求中缓存,那么httpcontext.items就是你要走的路。如果这不起作用那么你必须做错了什么,你究竟在哪里将数据添加到httpcontext.items?我通常使用httpmodule并在begin_request处理程序中添加数据,但这一切都取决于你想要做什么

答案 2 :(得分:0)

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