将LINQ ToDictionary与ConcurrentDictionary一起使用

时间:2013-10-01 20:50:51

标签: .net multithreading concurrentdictionary

我正在使用字典来收集多线程应用程序中的事件,在我添加事件时使用锁定,而在搜索事件时不使用它。 每隔一小时左右,我会对比某段时间更早的事件进行清理。 很简单,也很有效。

我想转移到ConcurrentDictionary来删除锁,我想我只需添加“Concurrent”并更改Add to TryAdd。 但后来我在错误中招致LINQ只返回ToDictionary。 我很可能不会使用LINQ,但我很想知道我能做些什么来保护它。 更重要的是,在转向ConcurrentDictionry之前,还有其他我应该考虑的事项吗?

public class messageResult
        {
            public Result result;
            public DateTime receivedTime;
        }


public Dictionary<Guid, messageResult> events = new Dictionary<Guid, messageResult>();


lock (events)
            {
                events = events.Where(p => p.Value.receivedTime >= t).ToDictionary(p => p.Key, p => p.Value);
            }

由于

2 个答案:

答案 0 :(得分:0)

看起来ToDictionary extension method并不复杂,您可以创建自己的版本。

但请注意,ToDictionary会返回新对象,而您希望拥有一个字典并在线程之间共享。

您不应该锁定可变变量(并且您还要将实际引用更改为events),创建私有只读变量并将其用于锁定。

答案 1 :(得分:0)

ToDictionary返回一个新实例...与您的共享实例不同。

您想要修改共享实例,并应编写执行该操作的代码:

foreach(var kvp in events.Where(...).ToList())
{
  var val = kvp.Value;
  events.TryRemove(kvp.Key out val);
}