【问题标题】:c# - ConcurrentDictionary.TryGet(): Do I need to use while?c# - ConcurrentDictionary.TryGet():我需要使用while吗?
【发布时间】:2017-11-07 07:48:31
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你怎么确定它在那里?您能否添加更多有关使用情况以及您要达到的目标的上下文?一般来说,如果 TryGet 返回 false,那么您需要假设该项目不在集合中。
  • 为什么不看看内部或文档? ILSpy 或 Reflector 将为您提供源代码(从 DLL 反编译,因此它看起来与原始代码不完全相同,但逻辑将保持不变)或者就像我说的那样查看 Microsoft 的文档,新的文档网站很不错

标签: c# concurrentdictionary trygetvalue


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    The documentation states

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 2021-10-24
      相关资源
      最近更新 更多