注意 千萬不要告訴我關於替代自定義會話,請只是相對於模式如何執行繼續迭代通過共享字典在多線程環境
方案
回答我已經完成自定義會話管理在我的應用程序(WCF服務)
爲此我有一個字典共享給所有線程。當一個特定的函數被調用時,我添加一個新的會話併發布SessionId給客戶端,這樣它就可以使用該sessionId作爲他的其他呼叫,直到它調用另一個特定的函數,這會終止該會話並從Dictionary中移除會話。
由於任何原因客戶端可能不會調用會話終止函數,所以我必須實現時間到期邏輯,以便我可以從內存中刪除所有這樣的會話。
爲此,我添加了一個Timer對象,它在特定時間段後調用ClearExpiredSessions函數。它在字典上迭代。
問題:
由於這本字典被修改每一個新客戶來了,樹葉,所以我不能鎖定整部字典在遍歷它的時候。如果迭代時我不鎖定字典,如果字典在迭代時從其他線程修改,則枚舉器將在MoveNext()上拋出異常。
所以有人可以告訴我這種情況下我應該遵循什麼樣的設計。有沒有可用的標準模式。
我正在鎖定添加/刪除但不是迭代,因此如果集合在檢索枚舉器後被修改,則會面臨異常。然而,它有一個重試邏輯,所以解決方法是在那裏,但我正在尋找一個已知的模式,如果有的話。 :( – 2010-05-25 04:51:30