2010-05-20 25 views
1

注意 千萬不要告訴我關於替代自定義會話,請只是相對於模式如何執行繼續迭代通過共享字典在多線程環境

方案

回答

我已經完成自定義會話管理在我的應用程序(WCF服務)

爲此我有一個字典共享給所有線程。當一個特定的函數被調用時,我添加一個新的會話併發布SessionId給客戶端,這樣它就可以使用該sessionId作爲他的其他呼叫,直到它調用另一個特定的函數,這會終止該會話並從Dictionary中移除會話。

由於任何原因客戶端可能不會調用會話終止函數,所以我必須實現時間到期邏輯,以便我可以從內存中刪除所有這樣的會話。

爲此,我添加了一個Timer對象,它在特定時間段後調用ClearExpiredSessions函數。它在字典上迭代。

問題:

由於這本字典被修改每一個新客戶來了,樹葉,所以我不能鎖定整部字典在遍歷它的時候。如果迭代時我不鎖定字典,如果字典在迭代時從其他線程修改,則枚舉器將在MoveNext()上拋出異常。

所以有人可以告訴我這種情況下我應該遵循什麼樣的設計。有沒有可用的標準模式。

回答

0

我沒有看到另一種方式來做到這一點,你的客戶只需要等待,而你鎖定和迭代字典。

在那個筆記上,聽起來好像你有一個問題,你還沒有遇到過......如果你沒有鎖定對字典的訪問,並且你有多個客戶端訪問它,最終你會有客戶之間的競爭條件。

+0

我正在鎖定添加/刪除但不是迭代,因此如果集合在檢索枚舉器後被修改,則會面臨異常。然而,它有一個重試邏輯,所以解決方法是在那裏,但我正在尋找一個已知的模式,如果有的話。 :( – 2010-05-25 04:51:30