我有一个静态字典,它保存web服务的身份验证。我正在运行一个计时器(因此下面方法中的TimerCallBack签名)来删除那些已经休眠了一段时间的身份验证。
我不太确定与linq相关的锁定行为。下面是我的代码。我有点担心使用太多的锁可能会影响性能。例如,只使用一个写锁而不使用读锁是不是更好(即使没有身份验证过期)?
private static void RemoveExpiredAuthentications(object o)
{
var expired = from a in _authentications
where a.Value.LastAccessed.AddSeconds(expired_interval_secs) < DateTime.Now
select a;
using (new ReadLock(dictionaryLock)) {
expired.Select(e => {
using (new WriteLock(dictionaryLock)){
_authentications.Remove(e.Value.Token);
}
}
}
}非常感谢
西蒙
发布于 2010-03-06 18:34:51
我建议先解决你想要删除的所有东西,然后在一个锁中完成所有的事情:
var itemsToRemove = expired.Select(e => e.Value.Token).ToList();
using (new WriteLock(dictionaryLock))
{
foreach (var removal in itemsToRemove)
{
_authentications.Remove(removal);
}
}抛开其他事情不谈,这意味着您不会在迭代时尝试从字典中删除项。
(只是检查一下:每个条目的键是否与Token属性值相同?如果是这样的话,您可以只使用e.Key而不是e.Value.Token -这可能会更清楚一些。)
发布于 2010-03-06 18:13:00
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);
};
}如果您要锁定,直到所有项目都被移除。
有时候Linq并不是最好的选择,尽管,我必须承认,很少。
https://stackoverflow.com/questions/2392086
复制相似问题