如何在多线程环境中对共享字典进行连续迭代

时间:2010-05-20 07:55:05

标签: .net multithreading

注意 请不要告诉我有关自定义会话的替代方法,请仅回答相对于模式

方案

我在我的应用程序(WCF服务)中完成了自定义会话管理

为此,我将一个字典共享给所有线程。当一个特定的函数被调用时,我向客户端添加一个新的Session和Issue SessionId,这样它就可以将其sessionId用于其余的调用,直到它调用另一个特定的函数,终止这个会话并从Dictionary中删除会话。

由于任何原因客户端可能不会调用会话终结器功能,因此我必须实现时间到期逻辑,以便我可以从内存中删除所有此类会话。

为此我添加了一个Timer对象,它在特定的时间段后调用ClearExpiredSessions函数。它在字典上重复。

问题:

因为每次新客户端出现时都会修改这个字典,所以在迭代它时我无法锁定整个字典。如果我在迭代时没有锁定字典,如果字典在迭代时从其他线程被修改,则Enumerator将在MoveNext()上抛出异常。

所以有人可以告诉我在这种情况下我应该遵循什么样的设计。有没有可用的标准模式。

1 个答案:

答案 0 :(得分:0)

我没有看到另一种方法,你的客户只需等待你锁定和迭代字典。

就此而言,听起来你有一个问题,你还没有遇到过......如果你没有锁定对该词典的访问,并且你有多个客户端访问它,最终你会有一个客户之间的竞争条件。