2012-11-08 97 views
9

害怕我已經知道答案。我有一個處理服務調用和緩存的類。爲了避免多次調用具有相同請求的服務,我當然可以在代碼塊周圍使用,但是許多這些方法具有不同的組成緩存密鑰的參數。當它可能是一個完全不同的緩存鍵(或多個不同的緩存鍵)時,等待鎖代碼塊執行似乎是一種恥辱。C#鎖定或不鎖定

我知道我可能做緩存鍵字符串本身的鎖定,但這是一個不允許的字符串可能會彈出任何地方。

因此,我可以在沒有鎖的情況下執行潛在的不必要的服務調用,或者通過等待鎖來在方法內添加潛在的不必要的延遲。

這些是我唯一的選擇還是另一個?

乾杯

+3

「爲了避免多次調用具有相同請求的服務,我當然可以使用鎖定」 - 這聽起來不太正確。鎖(System.Threading.Monitor.Enter/Exit)用於標記僅由給定鎖定的單個線程專門運行的代碼塊。它不會神奇地使重複的呼叫消失。請發佈一段代碼,答案可能基於。 – Tar

+0

@ default.kramer你可以做到這一點,但你需要有一個這些對象的字典或類似的東西,以便你可以找到另一個字符串。你還需要小心,確定你需要鎖定什麼的邏輯並不需要花費更多的時間/精力,而只需要鎖定一切(這取決於具體的用例)。 – Servy

回答

7

你可以潛在地切換在你的類型使用一個線程安全類,如ConcurrentDictionary<T,U>,來處理您的緩存。如果使用得當,這可以防止需要鎖定(您自己的鎖定),因爲您可以依賴併發集合本身內置的細粒度鎖定。