【发布时间】:2015-07-26 13:16:09
【问题描述】:
问题:我需要实现对象缓存。缓存需要是线程安全的,并且需要按需填充值(延迟加载)。这些值是通过 Web 服务通过 Key(慢速操作)检索的。所以我决定使用ConcurrentDictionary 和它的GetOrAdd() 方法,它有一个值工厂方法,假设操作是原子的和同步的。不幸的是,我在 MSDN 文章中找到了以下语句:How to: Add and Remove Items from a ConcurrentDictionary:
此外,虽然 ConcurrentDictionary 的所有方法都是 线程安全,并非所有方法都是原子的,特别是 GetOrAdd 和 添加或更新。传递给这些方法的用户委托是 在字典的内部锁之外调用。
这很不幸,但仍然没有完全回答我的答案。
问题:每个键是否只调用一次值工厂?在我的具体情况下:是否有可能多个线程正在寻找相同的密钥,从而产生对 Web 服务的多个请求以获得相同的值?
【问题讨论】:
-
不,使用 CD
>。这是标准模式。
标签: c# .net multithreading parallel-processing