首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LINQ - locking从字典中删除条目

使用LINQ - locking从字典中删除条目
EN

Stack Overflow用户
提问于 2010-03-06 18:00:35
回答 2查看 2.8K关注 0票数 2

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

我不太确定与linq相关的锁定行为。下面是我的代码。我有点担心使用太多的锁可能会影响性能。例如,只使用一个写锁而不使用读锁是不是更好(即使没有身份验证过期)?

代码语言:javascript
复制
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);
             }
         }
     }
}

非常感谢

西蒙

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-06 18:34:51

我建议先解决你想要删除的所有东西,然后在一个锁中完成所有的事情:

代码语言:javascript
复制
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 -这可能会更清楚一些。)

票数 4
EN

Stack Overflow用户

发布于 2010-03-06 18:13:00

代码语言:javascript
复制
foreach (var auth in expired) {
    using (new WriteLock(dictionaryLock)){
        _authentications.Remove(e => e.Value.Token);
    };
}

代码语言:javascript
复制
using (new WriteLock(dictionaryLock)){
    foreach (var auth in expired) {
        _authentications.Remove(e => e.Value.Token);
    };
}

如果您要锁定,直到所有项目都被移除。

有时候Linq并不是最好的选择,尽管,我必须承认,很少。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2392086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档