[asp.net-mvc]并发可排序列表或 O (logn) 并发集合

标签: Asp.net-MVC .Net C#
发布时间: 2017/3/25 0:06:47
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我需要缓存的 ASP.NET MVC 应用程序中的数据库中的数据很多,想要使用可排序列表。我知道.NET 4.0 添加并发集合但没有排序的集合。 我在想要使用 SynchronizedCollection,但它密集地使用锁甚至读取 (如果我没有记错),所以我在寻找其他的选项。基本上我需要 O (logn) 访问复杂性与并发集合。

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

void WrappedAdd(TKey k, TValue v)
{
  var copy = new SortedList<TKey, TValue>(_sortedList);
  copy.Add(k, v);
  _sortedList = copy;
}

解决方法 1:

您的要求是相当模糊的所以我真的不知道你想要什么。集合是否具有索引呢?键-值语义吗?

我不确定如果这符合你想要什么,但是你可以使用新的微软不可变收藏图书馆。它是 NuGet 上当前可用作为预览。它包含排序集合 (排序的集和字典),除其他外。

这些集合不是并发自己 (事实上,并发是一个非问题; 他们不能修改)。但是,您可以使用它们在并发设置通过包装他们,并在写入过程中使用锁定。阅读是线程安全的因为只有突变分配一个引用,是一个原子操作,所以你铁定要得到最新的结果你可能可以。

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

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];
    }
}
赞助商