3

我正在使用字典来收集多线程应用程序中的事件,在添加事件时使用锁,而在搜索事件时不使用它。每隔一小时左右,我就会对超过特定时间的事件进行清理。非常简单,而且有效。

我想移动到 ConcurrentDictionary 来删除锁,我想我只需要添加“并发”并将 Add 更改为 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);
            }

谢谢

4

2 回答 2

0

看起来ToDictionary 扩展方法并没有那么复杂,您可以创建自己的版本。

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

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

于 2013-10-01T20:59:50.580 回答
0

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

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

foreach(var kvp in events.Where(...).ToList())
{
  var val = kvp.Value;
  events.TryRemove(kvp.Key out val);
}
于 2013-10-01T21:14:41.313 回答