2009-04-23 31 views
5

我在這裏看到了很多關於這個主題的討論。關於C#和靜態類和函數的問題

如果我有一個靜態類w /靜態方法連接到數據庫或服務器,在多用戶環境(如網頁)中使用它是一個壞主意?這是否會讓新用戶在接受新用戶之前等待先前用戶的線程完成其呼叫?

這對多線程的影響是什麼?

Thx!

回答

6

如果每個靜態方法是獲取它的資源,然後處置其完全責任資源在方法調用的範圍內(不共享狀態),那麼你不應該有線程問題,你不會使用實例類。然而,我會建議更大的問題是,依賴公共靜態方法(靜態或非靜態類)會在後續創建許多其他設計問題。

  • 首先,你非常緊密地綁定到一個實現上,這個實現總是很糟糕。
  • 其次,測試依賴於靜態方法的所有類變得非常困難,因爲您被鎖定到單個實現。第三,創建非線程安全的方法變得非常容易,因爲靜態方法只能有靜態狀態(這是在所有方法調用中共享的)。
0

靜態只定義了方法定義的範圍,以及它如何被綁定/調用。它與多線程無關。

你需要小心靜態字段。它們由所有線程共享。線程不會彼此等待,但您需要鎖定才能使其工作。

但是,如果你的應用比Hello World複雜一點,你應該考慮讓你的方法不是靜態的,而是使用面向對象的模式。

3

靜態方法在多線程方面沒有任何特殊的行爲。也就是說,您可以期望同時運行該方法的多個「副本」。靜態變量也是如此 - 不同的線程可以一次訪問它們,不會在那裏等待。除非你小心,否則會造成混亂。

1

是的,這是一個壞主意。

當您使用爲所有用戶一個連接,如果有人執行需要一個動作,可以說15秒,只用於數據庫訪問,其他所有用戶都可以在爲了等待連接到數據庫

+0

這裏的壞主意是使用一個連接,而不是靜態方法,IMO。 – 2009-04-23 13:44:50

0

如果你使用一個靜態連接來訪問數據庫,你將不得不同步方法調用。多個線程通過單個連接向數據庫詢問數據將會...... ehhmmm ......搞砸了。所以你正在序列化所有線程的數據訪問,這會對性能產生很大的影響。

如果每個調用都打開自己的連接,則不需要序列化所有線程,因爲沒有共享連接。爲每個請求創建連接仍然是一個昂貴的設計。

如果您使用靜態連接池,您將減少此性能影響,因爲您只需要序列化對連接池的訪問。此外,靜態一般不是一個好的設計決定 - 它們使得單元測試非常複雜。你應該考慮使用Singleton或Monostate模式。

0

如果你這樣做,這不會是一個問題。如果你這樣做錯誤,它有潛力強制順序訪問資源。

有時候,對與錯的區別可能非常微妙,很難發現,但最主要的是沒有方法應該依賴或鎖定班級的任何「狀態」(成員)。

0

我使用靜態方法查找對象。我可以在一個位置管理所有查找對象(使用緩存),並且所有方法都使用靜態方法調用它。

通過這種方式,我不需要在每次需要時都實例化查找對象,並且它可以減少調用數據庫以提高性能的需求。