c#-ConcurrentDictionary.TryGet():我需要使用while吗?
我不确定我是否完全理解c#-ConcurrentDictionary.TryGet():我需要使用while吗?,c#,concurrentdictionary,trygetvalue,C#,Concurrentdictionary,Trygetvalue,我不确定我是否完全理解TryGet方法 当内部锁被锁定,这意味着如果我想获得值(知道它在那里),我应该使用而时,它何时准确返回false 或者这个,而以某种方式嵌入到这个函数内部,返回false意味着字典中没有这样一个键 注意。这是否适用于ConcurrentDictionary-TryAdd等的所有其他方法? 返回 布尔值 如果在ConcurrentDictionary中找到密钥,则为true;否则,错误 TryGet将阻塞,直到清除所有锁。它通常是一个很短的块(添加或删除密钥不需要很长时间)
TryGet
方法
当内部锁被锁定,这意味着如果我想获得值(知道它在那里),我应该使用而时,它何时准确返回false
或者这个,而以某种方式嵌入到这个函数内部,返回false
意味着字典中没有这样一个键
注意。这是否适用于ConcurrentDictionary
-TryAdd
等的所有其他方法?
返回
布尔值
如果在ConcurrentDictionary中找到密钥,则为true;否则,错误
TryGet
将阻塞,直到清除所有锁。它通常是一个很短的块(添加或删除密钥不需要很长时间)。如果键/值存在,则返回true,否则返回false。它不会等待添加密钥
如果您希望密钥由另一个线程填充,并且不确定是否已完成,那么可以使用while循环。但我从来没有这样做过。我认为,如果您发现自己在这种情况下编写while循环,您可能会遇到次优设计。考虑使用检索值,它允许您提供一个函数来填充密钥,如果它不存在,例如
var user = dictionary.GetOrAdd("User", (key) => GetUser());
如果您不想使用GetOrAdd
,并且必须等待另一个线程完成,请尝试重构您的代码,以便对其进行引用。那么a/等等。这将以比while循环更高效的方式产生执行。您如何确定它在那里?你能添加更多关于用法和你想要达到的目的的上下文吗?一般来说,如果TryGet返回false,那么您需要假设该项不在集合中。为什么不看看内部或文档呢?ILSpy或Reflector将为您提供源代码(从DLL中反编译,因此看起来与原始代码不完全相同,但逻辑将保持不变),或者就像我说的,从Microsoft上查看文档,新的文档网站相当不错