首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >并发SortedList或O(log )并发集合

并发SortedList或O(log )并发集合
EN

Stack Overflow用户
提问于 2014-03-20 22:56:26
回答 1查看 9.1K关注 0票数 5

我需要在ASP.NET MVC应用程序中缓存数据库中的大量数据,并希望使用SortedList。我知道.NET 4.0添加了并发集合,但是没有排序集合。我正在考虑使用SynchronizedCollection,但是即使在读取(如果我没有弄错的话),它也在密集地使用锁,所以我正在寻找其他选项。基本上,我需要一个具有O(log )访问复杂性的并发集合。

编辑-基于格雷格答案的代码

代码语言:javascript
运行
复制
void WrappedAdd(TKey k, TValue v)
{
  var copy = new SortedList<TKey, TValue>(_sortedList);
  copy.Add(k, v);
  _sortedList = copy;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-21 00:13:59

你的要求很模糊,所以我不知道你想要什么。这个集合应该有索引吗?键值语义?

我不确定这是否符合您的要求,但您可以使用新的微软不变馆藏库。它目前可以在NuGet上作为预览版使用。它包含排序集合(排序集和字典)等。

这些集合本身并不是并发的(实际上,并发性不是一个问题;它们不能被修改)。但是,您可以在并发设置中使用它们,方法是包装它们,并在写入过程中使用锁。读取是线程安全的,因为唯一的变异是分配一个引用,这是一个原子操作,因此您可以得到尽可能多的最新结果。

它们是基于树的,所以大多数操作都是log n操作。

代码语言:javascript
运行
复制
public class ConcurrentWrapper<TKey, T> {
    ImmutableSortedDictionary<TKey, T> _inner;

    public void Add(TKey key, T item) {
        lock (_inner) {
            _inner = _inner.Add(key, item);
        }
    }

    public T Get(TKey key) {
        return _inner[key];
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22546906

复制
相关文章

相似问题

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