0

我不确定我是否完全理解TryGet方法。

它何时准确返回false- 当内部锁被锁定时,这意味着while如果我想获得价值(知道它在那里)我应该使用?

或者这while以某种方式嵌入到这个函数内部并返回false意味着 -字典中没有这样的键?

注意。这适用于ConcurrentDictionary-TryAdd等的所有其他方法吗?

4

2 回答 2

5

TryGet将阻塞,直到任何锁被清除。它通常是一个非常短的块(添加或删除密钥不需要很长时间)。如果键/值存在,它将返回 true,否则返回 false。它不会等待添加密钥。

如果您希望密钥由另一个线程填充,并且您不确定它是否已完成,则可以使用 while 循环。但我从来没有这样做过。我认为,如果您发现自己在这种情况下编写了一个 while 循环,那么您的设计可能不是最理想的。考虑使用GetOrAdd来检索值,这允许您提供一个函数来填充不存在的键,例如

var user = dictionary.GetOrAdd("User", (key) => GetUser());

如果您不想使用GetOrAdd并且您绝对必须等待其他线程完成,请尝试重构您的代码,以便您可以引用它的 SynchronizationContext或它的Task。然后 / 等待它。这将以比 while 循环更有效的方式产生执行。

于 2017-11-07T08:11:19.677 回答
2

该文件指出

如果在 ConcurrentDictionary 中找到键,则返回布尔值 true;否则为假。

于 2017-11-07T08:07:23.897 回答