ASP.NET会话中的共享方法

时间:2011-02-25 03:48:23

标签: asp.net vb.net multithreading concurrency shared

作为上一个问题的后续内容,我问了"ASP.Net Architecture Specific to Shared/Static functions"

我仍然在努力理解在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:我为基本上重复的帖子道歉,但回想起来,我觉得原帖中的答案不够明确(至少对我而言)。也许我还不够具体......

3 个答案:

答案 0 :(得分:2)

Shared方法的唯一问题是共享

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

VB有另一个名为Static的概念,它与静态的C#版本非常不同,可能引起一些混淆。