2013-02-25 94 views
-1

我知道這種事情在這裏已經被問過很多次了,但是我還沒有完全理解ASP中的線程安全。這是ASP.net中的靜態變量線程安全c#

C#: 其中,Util是靜態類,List是靜態List。

Util.theList= new List<Object>(); 
Util.theList.Add(someObject); 

該頁面加載一次,然後進行第二次以後(1秒回發後)的Util.theList填充和頁面重新加載到與新填充的列表數據綁定:

this.Repeater.DataSource = Util.theList; 
      this.Repeater.DataBind(); 

每次的thelist填充它被實例化:

Util.theList= new List<Object>(); 

如果這不是線程安全的我怎樣才能使它線程安全的? 我不能名單的非靜態和在同一頁上,因爲一個單獨的問題,其中的數據,如果它是在Page_Load中必然會每次只能綁定: OnDataBind only fires on first postback

+2

在這種情況下有靜態列表買你什麼?無論如何你每次都要實例化這個列表? – 2013-02-25 17:24:08

+0

嗨凱爾,它讓我在第二次回傳時訪問同一個列表。而如果它不是靜態的,則列表在第二次回發時將爲空 – user1809104 2013-02-25 17:30:00

+0

什麼是usr狀態是正確的,使用ViewState進行回發。 – 2013-02-25 17:35:58

回答

5

這顯然是不安全的,因爲靜態變量之間共享要求。將列表移動到某個特定請求所獨有的位置,如頁面實例字段。

如果您需要跨回傳傳遞狀態,請使用ViewState或其他非全局機制。

+0

usr,從這個鏈接:http://asp.net-tutorials.com/state/viewstate/它聲明,viewstates最適用於簡單的數據。我不想存儲那些頁面建議我應該使用Sessions變量的複雜對象列表,但是對於我將這些數據存儲在會話變量中有點「黑客」 – user1809104 2013-02-25 17:40:41

+0

是會話錯誤,因爲範圍錯誤。您不希望爲用戶訪問的所有頁面維護這些數據。你只是想爲當前頁面。會話經常被濫用,並導致這些惱人的應用程序,你不能打開多個標籤。可能的解決方案:在會話中保留一個字典。每個頁面都有一個存儲在viewstate中的guid。這給你兩全其美。 – usr 2013-02-25 17:49:47

+0

我會嘗試你的解決方案,但有沒有更好的辦法,我可以做到這一點?唯一的問題是該列表僅在page_load之後填充。 – user1809104 2013-02-25 18:12:45

0

它最好,如果你一起避免靜態變量。 靜態變量與單元測試不太吻合。靜態類和變量不能被存根或模擬。

但是,在您的實例中,沒有靜態變量不是線程安全的。