我有一个客户端/服务器设置,它们之间有一个代理。我希望代理表现得更聪明一点,这样当连接 5 个客户端时,某些数据包可以从客户端中继到客户端,而不是客户端-> 服务器-> 客户端。每个客户端当前都有自己的线程,那么共享具有对其他客户端的引用的全局状态的最佳方式是什么。这个状态对象实际上只包含一个与每个客户端关联的 id 和一个对其套接字的引用,以便我可以在其上发送。
像字典这样简单的东西会起作用吗?我担心的是,在访问字典时,我可能有另一个客户端连接或断开连接,这将在我访问字典时修改字典。
您应该阅读Semaphores。
但在 C# 的上下文中,您需要确保谨慎且恰当地使用lock
关键字。这东西很难,而且很容易以灾难性的方式出错。
如果您的代理设置为 WCF 服务,那么您可以使用 ASP.NET 缓存。WCF 中的会话状态是每次调用,但缓存仍然潜伏在幕后。请注意,这只是为您提供缓存 - 它不会为您提供对缓存的任何预滚动访问控制,因此您仍然会遇到竞争问题。
有关使用缓存的更多信息,请查看之前的 SO 问题 How to return HttpContext.Current.Cache from WCF? 和这篇博文在 WCF 服务中启用会话状态。
如果字典是适合您情况的数据结构,字典会起作用。这个决定与多线程无关。
也就是说,如果您决定使用字典,则应使用同步对它的访问
lock
语句Dictionary