您可以使用ConcurrentDictionary一个一对多的映射?

我有一个映射,其中每个键可以有多个相关的值。 我认为,一个ConcurrentDictionary可能会帮助我更轻松地编写此映射在多线程环境中使用,但这些方法似乎是围绕一个单值建。 我看到AddOrUpdate()让我修改的值,如果它已经存在,但并不保证原子该操作如此看来毫无意义? 有没有人有解决这种状况好的呢?

对不起,我想我是有点含糊。 我想有多个值的一个关键,即有一个IList与密钥关联。 但是,我希望能够从多值添加/删除值以安全的方式。 它只是看起来像AddOrUpdate +委托方法可能会导致东西迷路如果通过多次调用它在同一十岁上下的时候发了?

--------------解决方案-------------

我认为AddOrUpdate是原子,但它看起来像它不是原子方面的委托。 抱歉!

引用这可能帮助:http://blogs.msdn.com/b/pfxteam/archive/2009/11/06/9918363.aspx

它看起来像两个AddOrUpdateTryUpdate会工作。

编辑

我可能也错了。 如果是这样,我不认为文档很清楚地说,所以我们只看看代码。 礼貌反射:

public TValue AddOrUpdate(TKey key, Func<TKey, TValue> addValueFactory, Func<TKey, TValue, TValue> updateValueFactory)
{
TValue local;
TValue local3;
if (key == null)
{
throw new ArgumentNullException("key");
}
if (addValueFactory == null)
{
throw new ArgumentNullException("addValueFactory");
}
if (updateValueFactory == null)
{
throw new ArgumentNullException("updateValueFactory");
}
do
{
if (!this.TryGetValue(key, out local3))
{
TValue local2;
local = addValueFactory(key);
if (!this.TryAddInternal(key, local, false, true, out local2))
{
continue;
}
return local2;
}
local = updateValueFactory(key, local3);
}
while (!this.TryUpdate(key, local, local3));
return local;
}

现在,如果更新了工厂现有列表,并返回一个新的带有一个额外的成员,它确实看起来对我来说,就好像它是原子的。 在竞争条件的情况下,输家将只需再次调用它们的更新工厂。 难道我错了?

分类:C# 时间:2015-03-15 人气:0
本文关键词: C#.NET 4.0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.403 (s). 10 q(s)