2011-02-25 65 views
2

作为后续对前一个问题我也问过"ASP.Net Architecture Specific to Shared/Static functions"共享方法在ASP.NET会话

我仍然在努力理解ASP.NET中使用共享方法的影响。

例如,让我们拿下面的代码。

Public Shared Function GetCategoryByID(ByVal CategoryID As Guid) As Category 
     If Not CategoryID.Equals(Guid.Empty) Then 
      Dim res As New Category 

      Using sqlConn As New SqlConnection(My.Settings.ConnectionString) 
       sqlConn.Open() 

       Using dr As IDataReader = CategoryDataLayer.GetCategoryByIDQuery(sqlConn, CategoryID) 
        Return CType(BaseDataLayer.FillObject(res, dr), Category) 
       End Using 
      End Using 

     Else 
      Return Nothing 
     End If 
    End Function 

现在我想象客户机1连接,并与GUID {A20E625F-2333-4742-BFD9-05BE7649222D}运行此方法GetCategoryByID()从他们的会话。

现在让我们说,例如该过程即将执行以下行。

Using dr As IDataReader = CategoryDataLayer.GetCategoryByIDQuery(sqlConn, CategoryID) 

此时客户机2组的运行的相同的共享的方法,但用GUID {6D806B82-FC7F-4124-AFB9-45E2689BC9F5}。

目前没有CategoryID变为{6D806B82-FC7F-4124-AFB9-45E2689BC9F5}并因此干扰客户端1,因为现在CategoryID发生了变化,因为这是共享方法?

有人请澄清?

PS:我很抱歉,本质上是一个重复的帖子,但回想起来,我觉得原帖中的答案不够清楚(至少对我而言)。也许我还不够具体...

回答

2

在您的代码示例中,变量res是共享方法的局部变量。没有人,甚至没有其他共享方法可以触及这个变量。它将存在于该方法的一生中,然后消失。 CategoryId是完全相同的,它是一个局部变量,不能从外部触及。

VB有另一个概念叫Static,它与静态的C#版本有很大的不同,它会引起一些混淆。

2

Shared方法的唯一问题是共享状态

如果您使用Shared字段或Static变量,它将在请求之间共享,并造成麻烦。

但是,不使用任何外部状态或共享对象的Shared方法将正常工作。

2

即使正在运行相同的方法,它正在两个不同的上下文中运行。该方法的任何局部变量(包括CategoryId参数)都不共享。