c# - ConcurrentDictionary.TryGet(): 我需要使用 while 吗?
c# - ConcurrentDictionary.TryGet(): Do I need to use while?
我不确定我是否完全理解 TryGet
方法。
什么时候 return false
- 当内部锁被锁定时,这意味着我应该使用 while
如果我想获得价值(知道它在那里)?
或者这个 while
以某种方式嵌入到这个函数内部并且 returning false
意味着 - 没有 这样的键词典?
注意。这是否适用于 ConcurrentDictionary
- TryAdd
等的所有其他方法?
Returns
Boolean
true if the key was found in the ConcurrentDictionary; otherwise, false.
TryGet
将阻塞,直到所有锁被清除。它通常是一个非常短的块(添加或删除密钥不需要很长时间)。如果 key/value 存在,它将 return 为真,否则为假。它不会等待添加密钥。
如果您希望密钥由另一个线程填充,并且您不确定它是否完成,您可以使用 while 循环。但我从来没有这样做过。我认为,如果您发现自己在这种情况下编写了一个 while 循环,那么您的设计可能不是最理想的。考虑使用 GetOrAdd 检索值,这允许您提供一个函数来填充键(如果它不存在),例如
var user = dictionary.GetOrAdd("User", (key) => GetUser());
如果您不想使用 GetOrAdd
并且您绝对必须等待另一个线程完成,请尝试重构您的代码以便引用它的 SynchronizationContext or its Task。然后a/wait它。这将以比 while 循环更有效的方式产生执行。
我不确定我是否完全理解 TryGet
方法。
什么时候 return false
- 当内部锁被锁定时,这意味着我应该使用 while
如果我想获得价值(知道它在那里)?
或者这个 while
以某种方式嵌入到这个函数内部并且 returning false
意味着 - 没有 这样的键词典?
注意。这是否适用于 ConcurrentDictionary
- TryAdd
等的所有其他方法?
Returns Boolean true if the key was found in the ConcurrentDictionary; otherwise, false.
TryGet
将阻塞,直到所有锁被清除。它通常是一个非常短的块(添加或删除密钥不需要很长时间)。如果 key/value 存在,它将 return 为真,否则为假。它不会等待添加密钥。
如果您希望密钥由另一个线程填充,并且您不确定它是否完成,您可以使用 while 循环。但我从来没有这样做过。我认为,如果您发现自己在这种情况下编写了一个 while 循环,那么您的设计可能不是最理想的。考虑使用 GetOrAdd 检索值,这允许您提供一个函数来填充键(如果它不存在),例如
var user = dictionary.GetOrAdd("User", (key) => GetUser());
如果您不想使用 GetOrAdd
并且您绝对必须等待另一个线程完成,请尝试重构您的代码以便引用它的 SynchronizationContext or its Task。然后a/wait它。这将以比 while 循环更有效的方式产生执行。