- 我有一堆儿童对象,凡是涉及到一个给定的家长。我正在处理一个ASP.NET MVC 3 Web应用程序(例如多线程)
- 其中一个网页是一个“搜索”页面,我需要抓住一个给定的儿童子集和“做东西“(计算,订购,枚举)
- 而不是让每个孩子在一个单独的调用,我做一个调用数据库来获取给定的父母的所有孩子,缓存结果和”做的东西“结果。
- 问题是,“做什么”涉及LINQ操作(枚举,添加/删除集合中的项目),当使用
List<T>
实施时,它不是线程安全的。
我看了一下ConcurrentBag<T>
和ConcurrentDictionary<T>
,但不知道我是否应该用其中的一个,或实现同步/锁定自己。
我在.NET 4上,所以我利用ObjectCache
作为MemoryCache.Default
的单例实例。我有一个与缓存一起工作的服务层,服务接受通过构造函数DI完成的ObjectCache
实例。这样所有的服务共享相同的ObjectCache
实例。
主线程安全问题是我需要遍历当前的“缓存”集合,如果我正在使用的孩子已经在那里,我需要删除它并添加一个我正在使用的在这个枚举是导致问题的原因。
有什么建议吗?
@Rick - 感谢您的回答,真的有见地+1。你可以看看我发布的答案,看看我是否在正确的轨道上。我真的不想做一个深层的复制品,因为这些藏品非常大。我用不同的方法完成了 - 看一看。 – RPM1984 2011-05-26 23:39:45
@ RPM1984:许多事情看起来不错。但我认为你高估了复制'List'的成本。每次你使用LINQ的'ToList'时,你都会做一个_shallow_副本。这就是我推荐的那种复制。要访问回购,你会自动获得一个全新的'List'。我想你可以调用'AsReadOnly'并将其放在缓存中。我没有看到第二级'ConcurrentDictionary'的优点,但我可能会错过一些东西。 –
2011-05-27 02:01:19
@Rick - 你的权利,并发字典不提供任何价值,因为它在锁内。当从缓存中拉出时,我已更改为'ReadOnlyCollection',并且在添加到缓存时接受'List '。我想保留RWLS只是为了让人安心,至少。 –
RPM1984
2011-05-27 05:07:32