2011-02-25 88 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參數)都不共享。