Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#-ConcurrentDictionary.TryGet():我需要使用while吗?_C#_Concurrentdictionary_Trygetvalue - Fatal编程技术网

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上查看文档,新的文档网站相当不错