【问题标题】:is this approach thread safe这种方法线程安全吗
【发布时间】:2015-02-06 20:43:07
【问题描述】:

线程下面的方法安全吗?我知道 ConcurrentDictionary 提供 TryRemove 方法,但我只是不喜欢有一个我永远不会使用的值变量。

ConcurrentDictionary<int, int> myDict = new ConcurrentDictionary<int, int>();

if (myDict.ContainsKey(1))
    ((IDictionary<int, int>)myDict).Remove(1);

【问题讨论】:

  • TryRemove 暴露是有原因的。
  • 这是一个愚蠢的论点。 TryRemove 是访问数据的最安全方式。你会得到一个 True/False 的返回值,让你知道是否应该处理 out 变量。
  • 如果您真的不喜欢在 TryRemove 之后放置变量,那么只需确定它的范围,使其仅对该调用有效。
  • @Katie 这是可能的,但在 C# 中相当麻烦。
  • 为什么忽略存储在字典中的值?如果答案是“我已经读过了。”,那么很可能您的代码不是线程安全的。

标签: c# multithreading concurrentdictionary


【解决方案1】:

您的目标似乎是通过消除使用out 参数的需要来提高代码清晰度。这是一个合理的担忧,但使用 Remove 不是正确的方法。

为自己定义一个辅助方法:

static bool TryRemove<TKey, Value>(
      this ConcurrentDictionary<TKey, Value> dict, TKey key) {
 TValue value;
 return dict.TryRemove(key, out value);
}

【讨论】:

  • 比 CLR 给我的更喜欢它
  • @Servy 是的,我的意思是 .NET
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 2012-12-18
  • 1970-01-01
相关资源
最近更新 更多