簡體   English   中英

關於C#和靜態類和函數的一個問題

[英]A Question About C# and Static Classes and Functions

我在這里看到了很多關於這個主題的討論。

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

多線程也會帶來什么影響呢?

謝謝!

如果每個靜態方法完全負責獲取其資源,然后將其資源置於方法調用的范圍內(沒有共享狀態),那么使用實例類時不應該遇到線程問題。 但是,我建議,更大的問題是依賴公共靜態方法(在靜態或非靜態類中)會在未來產生許多其他設計問題。

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

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

是的,這是一個壞主意。

當您為所有用戶使用一個連接時,如果有人執行需要的操作,比如說15秒,僅用於數據庫訪問,則所有其他用戶必須等待才能連接到數據庫

這個問題有點緊張。 至於為什么你有這么多靜電。

但是我認為你在詢問線程問題,所以我想去看一下有關線程的一些文檔.http://msdn.microsoft.com/en-us/library/c5kehkcz(VS.80).aspx

Static僅定義定義方法的范圍,以及如何綁定/調用方法。 它與多線程無關。

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

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

如果使用一個靜態連接來訪問數據庫,則必須同步方法調用。 通過單個連接向數據庫詢問數據的多個線程將......嗯......搞砸了。 因此,您要序列化所有線程的數據訪問權限,這將對性能產生很大影響。

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

如果使用靜態連接池,則會降低性能影響,因為您只需要序列化對連接池的訪問。

此外,靜力學通常不是一個好的設計決策 - 它們使單元測試非常復雜。 您應該考慮使用Singleton或Monostate模式。

如果你做對了 ,那就沒問題了。 如果你做錯了 ,它有可能強制順序訪問資源。

有時,正確和錯誤之間的區別可能非常微妙且難以發現,但主要的是沒有方法應該依賴或鎖定類的任何“狀態”(成員)。

我使用靜態方法查找對象。 我可以在一個地方(使用緩存)為asp.net應用程序管理所有查找對象,所有方法都使用靜態方法調用它。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM