2009-07-09 47 views
6

我懷疑這也適用於一般的ASP.Net,但我不確定。ASP.Net中的線程安全MVC

如果我有一個控制器上的操作方法,比如說MyController.DoSomethingExciting和三個客戶端在同一時間點擊它,它本質上是線程安全的,還是我需要做些事情來確保三個併發調用不要互相交流?

回答

13

該方法中的局部變量將是每次調用。我認爲(不知道MVC)Controller實例是每個請求,所以任何實例成員都是安全的。

但是,如果有任何靜態或其他共享成員,那麼他們是不安全的。

+2

控制器實例是每個請求都是正確的 – roryf 2009-07-09 13:09:13

+0

是否每個請求都有一個控制器實例,使其線程安全?或者有沒有一種方法可以讓一個控制器的實例在同一個請求中被多個線程使用?我想確定是否給控制器一個私有變量,它是線程安全的。 – xr280xr 2015-05-27 22:31:02

2

如果方法實例化所有自己的變量並且不使用任何靜態成員,那麼它在所有情況下都應該可以。

它的對象一次被多個線程引用,它多次讀取一些可以被另一個線程修改的類級變量,然後可能會出現問題。

如果它只讀取一次數據並且沒有在類級寫入任何內容,那麼多線程是不成問題的。

2

不一定。取決於「線程安全」的含義。

假設他們共享一個實體框架,比如說「db」,並且它們在某個表上工作。因爲你調用你的控制器「MyController」讓我們調用這個db.MyTable 每個請求都召喚一個不同的MyController實例。到目前爲止,線程安全。每個控制器創建一個MyEntities的實例db = new MyEntities();目前爲止線程安全。但由於db.MyTable是IEnumerable類型的<MyTable>,因此它們會相互交互。假設他們在數據庫中使用同一個實體(沒有鎖),比如說db.MyTable [0] - 他們會相互覆蓋(「最後一個存儲勝利」)。

您網站的3個用戶將有三個指向同一位置(在數據庫中)的獨立指針(在堆棧中)。這不是一個線程問題。這是一個數據鎖定問題。