什么是维护所有线程都可访问的全局状态的线程安全方法

时间:2012-08-09 22:03:07

标签: c# .net

我有一个客户端/服务器设置,它们之间有代理。我希望代理表现得更聪明一些,这样当连接5个客户端时,某些数据包可以从客户端转发到客户端而不是客户端 - >服务器 - >客户。每个客户端当前都有自己的线程,因此共享引用其他客户端的全局状态的最佳方式是什么。这个状态对象实际上只包含一个与每个客户端关联的id和一个对它们的套接字的引用,以便我可以发送它。

像字典一样简单的工作吗?我担心的是,在访问字典时,我可能有另一个客户端连接或断开连接,这将修改字典作为我访问它。

3 个答案:

答案 0 :(得分:0)

您应该阅读Semaphores

但是在C#的上下文中,您需要确保使用lock关键字仔细而恰当地进行操作。这些东西是 hard ,很容易在灾难性的方式出错。

答案 1 :(得分:0)

如果您的代理设置为WCF服务,则可以使用ASP.NET缓存。 WCF中的会话状态是每次调用,但缓存仍然存在于幕后。请注意,这只是为了给你缓存 - 它不会给你任何预先滚动的访问控制到缓存,所以你仍然可以得到种族问题。

有关使用缓存的详细信息,请查看此前的SO问题如何返回HttpContext.Current.Cache from WCF?以及此博文Enable Session State in a WCF service

答案 2 :(得分:0)

字典可以工作,如果字典是适合您情况的数据结构。这个决定与多线程没什么关系。

也就是说,如果你决定使用字典,你应该使用

同步对它的访问