我正在使用字典来收集多线程应用程序中的事件,在我添加事件时使用锁定,而在搜索事件时不使用它。 每隔一小时左右,我会对比某段时间更早的事件进行清理。 很简单,也很有效。
我想转移到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);
}
由于
答案 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);
}