C# ConcurrentDictionary TryRemove何时返回false

C# ConcurrentDictionary TryRemove何时返回false,c#,.net,concurrency,C#,.net,Concurrency,如果字典不包含给定键的值,它将只返回false,还是由于线程竞争条件,它也将返回false,就像另一个线程添加/更新某些内容一样 代码中的问题: ConcurrentDictionary<int, string> cd = new ConcurrentDictionary<int, string>(); // This might fail if another thread is adding with key value of 1. cd.TryAdd(1, "on

如果字典不包含给定键的值,它将只返回false,还是由于线程竞争条件,它也将返回false,就像另一个线程添加/更新某些内容一样

代码中的问题:

ConcurrentDictionary<int, string> cd = new ConcurrentDictionary<int, string>();

// This might fail if another thread is adding with key value of 1.
cd.TryAdd(1, "one"); 

// Will this ever fail if no other thread ever removes with the key value of 1?
cd.TryRemove(1); 
ConcurrentDictionary cd=新建ConcurrentDictionary();
//如果另一个线程正在使用键值1进行添加,则此操作可能会失败。
cd.TryAdd(1,“一”);
//如果没有其他线程使用键值1删除,该操作会失败吗?
cd.TryRemove(1);
编辑: 我认为,如果它不包含给定键的值,它只会返回false,但要绝对确定。

不会受到竞争条件的影响。这就是你使用它的原因

返回值

如果删除了对象,则为true 成功地否则,错误

虽然
ConcurrentDictionary
不易受到种族条件的影响,但我认为您所问问题的答案是肯定的,如果钥匙存在,
TryRemove
将工作并返回
true


在您发布的代码中,
TryRemove
不可能返回
false
,因为
cd
是一个本地变量,在其他任何地方都无法访问。但是,如果其他地方的一些代码引用了这个
ConcurrentDictionary
对象,并且在一个单独的线程中删除了键,那么
TryRemove
可能会返回
false
,即使在这里,但只是因为键已经被删除了,这不是因为正在对字典执行其他操作,而且键不知何故被“卡住”了。

还有一点需要说明:

这个评论是不正确的,并且可能对“尝试”的含义有同样的误解。这不是关于并发添加的尝试,而是是否已经使用键
1
添加了值

考虑一个标准的
词典
。等效代码为:

if (!d.Contains(1))
    d.Add(1, "one");
这需要两个操作。没有办法设计这样一个线程安全的API,因为
cd
可能在调用
Contains
Add
之间添加了一个键为
1
的值,这将导致
Add
抛出

并发集合具有API,这些API在逻辑上将这些测试和执行对捆绑到单个原子操作中,并在单个API后面

if (!d.Contains(1))
    d.Add(1, "one");