代码之家  ›  专栏  ›  技术社区  ›  Mubashar

多线程环境下如何在共享字典上执行连续迭代

  •  1
  • Mubashar  · 技术社区  · 14 年前

    笔记 请不要告诉我定制会话的替代方案,请只回答与模式相关的问题

    脚本

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

    为此,我有一本字典供大家共享。当一个特定的函数被调用时,我会添加一个新的会话,并向客户机发出SessionId,这样它就可以在他的其余调用中使用该SessionId,直到它调用另一个特定的函数为止,该函数会终止该会话并从字典中删除该会话。

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

    为此,我添加了一个计时器对象,它在特定时间段后调用ClearExpiredSessions函数。它在字典上反复出现。

    问题:

    因为每次新客户端出现和离开时,这个字典都会被修改,所以我不能在迭代时锁定整个字典。如果我在迭代时没有锁定字典,如果字典在迭代时从其他线程得到修改,枚举器将在MoveNext()上抛出异常。

    那么,有谁能告诉我,在这种情况下,我应该遵循什么样的设计。有没有标准的款式。

    1 回复  |  直到 14 年前
        1
  •  0
  •   Steven Evers    14 年前

    我看不出其他方法可以做到这一点,你的客户将不得不等待,而你锁定和迭代字典。

    在这一点上,听起来你有一个你还没有遇到的问题。。。如果您没有锁定对该字典的访问,并且有多个客户端访问它,那么最终您将在客户端之间遇到竞争条件。