2011-11-07 11 views
0

我使用VS2010,C#開發我的ASP.NET Web應用程序,有時我需要在我的代碼隱藏文件開始時聲明公共或甚至公共靜態變量,以便我可以在文件中全局訪問它們,並且它們在回發之間保留它們的值,在本地服務器上一切正常(因爲我是運行代碼的唯一人員)。但我不確切知道當這個頁面(以及它的代碼隱藏)同時由多個網站訪問者運行時會發生什麼,我希望我的程序對所有用戶運行相同,但我認爲這樣做導致的問題,我記得從我以前的ASP.NET經驗,在代碼隱藏中使用變量(公共或公共靜態)可能會導致對網站的不同用戶的誤解,例如: 用戶A運行程序,(公共靜態int)my_int在啓動時值-1爲100,此時用戶B運行相同的頁面,因此my_int爲100,這會導致問題,並且假設用戶A離開頁面,而my_int的值爲100,那麼用戶B將訪問頁面my_int最初爲100(而應該是-1),所以我認爲會出現意想不到的行爲ASP.NET變量對於不同用戶的價值

是不是正確?這會發生嗎?如果是這樣,我該如何預防呢?我應該使用會話而不是變量?我怎麼能有關於整個情況更加了解

感謝網友

+0

正如我所說的,當我在本地主機上開發我的應用程序時,一切正常,變量有它們的值和算法正常工作,但目前我是唯一運行該網站的人,所以我認爲當許多用戶同時訪問我的頁面時,我會遇到問題 –

+0

@rahularyansharma根據定義,靜態變量會執行此操作,前提是工作進程未被重置。 –

回答

1

一個簡單的規則 - 你需要選擇存儲按存儲數據的範圍。對於任何可變(讀/寫)共享狀態,您都擔心併發訪問(線程安全)。例如,如果一個變量是一個靜態變量,那麼它將提供整個應用程序(正確地說是應用程序域),但這也意味着在讀取/寫入變量時確保線程安全。這裏有一些提示

  1. 對於每個請求範圍,使用局部變量。不需要線程安全(因爲只有請求線程可以訪問它)。
  2. 對於每個頁面作用域(在重複的post-backs之後),使用視圖狀態。不需要線程安全(因爲只有請求線程可以訪問它)。
  3. 對於每個用戶範圍,請使用會話狀態。關於會話狀態的一個好處是你不必擔心線程安全性(ASP.NET注意到這一點)。
  4. 對於應用程序範圍(嚴格來說,應用程序域範圍),使用應用程序狀態或靜態變量。應用程序狀態爲線程安全提供了鎖定/解鎖API,而對於靜態變量,您已經設置了自己的鎖定機制。對於應用程序範圍的只讀數據,靜態變量是很好的選擇,即在應用程序開始時對它們進行初始化,然後在沒有寫入的情況下使用無需鎖定的信息。
  5. 對於任何大於此值的作用域,請使用數據庫(或任何其他持久數據存儲)。對於數據庫,事務用於確保一致性。
+0

感謝朋友,我想我已經找到了我的答案,所以我應該對我的代碼進行一些更改! –