例如:
ConcurrentDictionary<string,Payload> itemCache = GetItems();
foreach(KeyValuePair<string,Payload> kvPair in itemCache)
{
if(TestItemExpiry(kvPair.Value))
{ // Remove expired item.
Payload removedItem;
itemCache.TryRemove(kvPair.Key, out removedItem);
}
}
Run Code Online (Sandbox Code Playgroud)
显然,对于普通的Dictionary,这将引发异常,因为删除项会在枚举的生命周期中更改字典的内部状态.我的理解是,并非ConcurrentDictionary的情况,因为提供的IEnumerable处理内部状态更改.我明白了吗?有更好的模式可供使用吗?
我正在尝试更新ConcurrentDictionary中的条目,如下所示:
class Class1
{
public int Counter { get; set; }
}
class Test
{
private ConcurrentDictionary<int, Class1> dict =
new ConcurrentDictionary<int, Class1>();
public void TestIt()
{
foreach (var foo in dict)
{
foo.Value.Counter = foo.Value.Counter + 1; // Simplified example
}
}
}
Run Code Online (Sandbox Code Playgroud)
基本上我需要遍历字典并更新每个Value上的字段.我从文档中了解到我需要避免使用Value属性.相反,我认为我需要使用TryUpdate,除了我不想替换我的整个对象.相反,我想更新对象上的字段.
在PFX团队博客上阅读此博客条目之后:也许我需要使用AddOrUpdate并且在添加委托中什么也不做.
有没有人对如何做到这一点有任何见解?
我在字典中有成千上万的对象,我需要每30秒左右更新一次.创建新的以更新属性可能是不可行的.我需要克隆现有对象,更新它并替换字典中的对象.我还需要在克隆/添加周期的持续时间内锁定它.呸.
我想做的是迭代对象并尽可能直接更新Counter属性.
我的最新研究让我看到了Parallel.ForEach,这听起来很棒,但不应该用于更新状态的动作.
我也看到了Interlocked.Increment的提及听起来不错,但我仍然需要弄清楚如何以线程安全的方式在我的字典中的每个元素上使用它.