【问题标题】:updating Dictionary code with ConcurrentDictionary使用 ConcurrentDictionary 更新字典代码
【发布时间】:2016-02-18 15:03:43
【问题描述】:

如何更新以下代码以使用 ConcurrentDictionary?

private Dictionary (string, SymbolOrderBook) books = new Dictionary(string, SymbolOrderBook)();

SymbolOrderBook book;

lock (books)
{
    if (!books.TryGetValue(symbol, out book))
    {
        book = new SymbolOrderBook(symbol);
        books.Add(symbol, book);
    }
}

【问题讨论】:

  • 而你在为阻止你自己做这件事而苦苦挣扎?我们也不能转换它,因为那不是有效的代码。例如,book 是函数的本地变量还是类级别的变量?请显示方法声明。
  • 看看GetOrAdd方法。

标签: c# .net multithreading concurrency concurrentdictionary


【解决方案1】:

您可以像这样使用GetOrAdd 方法:

首先,您像这样定义字典:

private ConcurrentDictionary<string, SymbolOrderBook> books =
    new ConcurrentDictionary<string, SymbolOrderBook>();

然后你得到或添加这样的条目:

SymbolOrderBook book = books.GetOrAdd(symbol, s => new SymbolOrderBook(s));

它的作用是,如果指定符号存在,则返回现有的书,否则,它会创建一个新书,将其添加到字典中,然后返回它。所有这些都发生在原子操作中。

【讨论】:

  • 谢谢,这正是我要找的。​​span>
【解决方案2】:
using System.Collections.Concurrent;

ConcurrentDictionary<string, SymbolOrderBook> books = new ConcurrentDictionary<string, SymbolOrderBook>();
SymbolOrderBook book = new SymbolOrderBook(symbol);
books.GetOrAdd(symbol, book);

【讨论】:

  • 就我个人而言,我会使用Func&lt;string, SymbolOrderBook&gt; 的重载,这样除非您需要,否则您不会创建新书。此外,从 OP 的代码中也不清楚是否稍后在代码中使用 book,您当前的答案将使 book 每次都是一个新值,并且永远不会获得存储的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
相关资源
最近更新 更多