使用LINQ锁定从字典中删除条目

使用LINQ锁定从字典中删除条目,linq,locking,Linq,Locking,我有一个静态字典,它保存web服务的身份验证。我正在运行一个计时器(因此下面方法中的TimerCallBack sig)来删除那些休眠了一段时间的身份验证 我不太确定我需要的与linq相关的锁定行为。这是我的密码。我有点担心使用太多锁可能会影响性能。e、 g.只进行一次写锁而不进行读锁(即使没有验证过期)会更好吗 private static void RemoveExpiredAuthentications(对象o) { var expired=来自一个in_身份验证 其中a.Value.L

我有一个静态字典,它保存web服务的身份验证。我正在运行一个计时器(因此下面方法中的TimerCallBack sig)来删除那些休眠了一段时间的身份验证

我不太确定我需要的与linq相关的锁定行为。这是我的密码。我有点担心使用太多锁可能会影响性能。e、 g.只进行一次写锁而不进行读锁(即使没有验证过期)会更好吗

private static void RemoveExpiredAuthentications(对象o)
{ 
var expired=来自一个in_身份验证
其中a.Value.LastAccessed.AddSeconds(过期时间间隔秒){
使用(新写锁(字典锁)){
_身份验证。删除(如Value.Token);
}
}
}
}
非常感谢

西蒙

如果您拒绝锁定,直到移除所有项目


有时候Linq不是最好的选择,尽管我不得不承认,很少。我建议先解决所有要删除的内容,然后在一个锁中完成:

var itemsToRemove = expired.Select(e => e.Value.Token).ToList();

using (new WriteLock(dictionaryLock))
{
    foreach (var removal in itemsToRemove)
    {
        _authentications.Remove(removal);
    }
}
除此之外,这意味着您在迭代字典时不会试图从字典中删除条目


(只需检查:每个条目的键是否与
令牌
属性值相同?如果是这样,您可以使用
e.key
而不是e.value.Token-这可能更清楚一些。)

哇…非常快。很多thx。您能解释一下为什么吗?请再说一遍thx
foreach (var auth in expired) {
    using (new WriteLock(dictionaryLock)){
        _authentications.Remove(e => e.Value.Token);
    };
}
using (new WriteLock(dictionaryLock)){
    foreach (var auth in expired) {
        _authentications.Remove(e => e.Value.Token);
    };
}
var itemsToRemove = expired.Select(e => e.Value.Token).ToList();

using (new WriteLock(dictionaryLock))
{
    foreach (var removal in itemsToRemove)
    {
        _authentications.Remove(removal);
    }
}