如果字典不包含给定键的值,它将只返回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); 

Edit:个 我认为只有在不包含给定键的值的情况下,它才会返回false,但希望绝对确定.

推荐答案

虽然Mitch is right表示ConcurrentDictionary不易受到种族条件的影响,但我认为你要问的问题的答案是肯定的,如果 keys 存在,TryRemove将工作,并返回true.

在你发布的代码中,TryRemove不可能返回false,因为cd是一个局部变量,其他地方无法访问.但是,如果其他地方的一些代码引用了这个ConcurrentDictionary对象,并且在一个单独的线程中删除了键,那么TryRemove可能会返回false,即使在这里——但返回only because the key was already removed,这不是因为字典上正在执行其他操作,而键不知怎的"卡住"了.

.net相关问答推荐

实体框架核心:Azure容器应用程序的执行超时已过期

Npgsql Minimum Pool Size 似乎没有被考虑在内

将日期时间转换为日期格式 dd/mm/yyyy

为什么 C# 不允许像 C++ 这样的非成员函数

将客户端证书添加到 .NET Core HttpClient

如何明智地使用 StringBuilder?

处理序列没有元素异常

如何在 .NET 中将字符串转换为字节数组?

图像与位图类

msbuild,定义条件编译符号

属性应该与其类型同名吗?

C# 属性实际上是方法吗?

什么是 Hashtable 的通用版本?

如何将时间设置为当天的午夜?

寻找 .NET 的命令行参数解析器

为什么 C# 不推断我的泛型类型?

如何从 .NET 读取 PEM RSA 私钥

如何获得 Bin 路径?

为什么 !0 是 Microsoft 中间语言 (MSIL) 中的一种类型?

MVVM 没有意义吗?