ASP.NET COM + Dispose Exception

时间:2011-10-27 00:59:43

标签: asp.net session-state com+

我们的ASP.NET应用程序正在使用COM +连接到数据库

我们有这个结构:

  1. 基类:

    导入System.EnterpriseServices

    Public Class Base Inherited ServicedComponent

  2. 儿童班:

     Public Class Member Inherits Base
    

    “Propreties     。     。     

    'Methods
    Public Sub SetMember(ByVal SelectedQueue As String)
            ...
    End Sub
    
  3. 在Aspx页面中,我们搜索成员并设置详细信息:

    Dim newMember As Member =  New Member 
    newMember.SetMember(MemberNumber)
    Session("SelectedMember") = newMember
    

    然后我们处理newMember:

     If Not newMember Is Nothing Then
                    newMember.Dispose()
     End If
    

    但是当我们访问会话时,我们得到了一个例外:

       If Not Session("SelectedMember") Is Nothing Then
                    'Something
                Else
                    'Something else
                End If 
    

    例外是: 无法访问已处置的对象。对象名称:'ServicedComponent'。

    如何处置对象但保持会话有效?

1 个答案:

答案 0 :(得分:1)

我可以看到你做错了什么,但不清楚什么是对的。您所陈述的逻辑是:

  1. 获取对象。
  2. 存储对象。
  3. 清理对象,使其无用。
  4. 检索对象。
  5. 使用对象。
  6. 在5之前有3个没有意义。

    如果快速获取对象,则应该在每个页面上执行此操作。 (通常人们高估了这个成本)。

    如果对象的获取速度很慢,并且长期存储是有意义的,那么就不需要清理它。什么是Dispose()实际上在这里做什么?随着它根据需要获取和释放成员使用的资源。

    我怀疑第一个是去的地方,但这主要是猜测。

    当你谈论数据库时,我也会担心你的对象是否持有数据库连接?如果是这样,并且池可用,那么您应该尽快释放这些连接,而不是保留它们。