Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要不强制执行数据一致性的高性能C#集合_C#_Multithreading_.net Core - Fatal编程技术网

需要不强制执行数据一致性的高性能C#集合

需要不强制执行数据一致性的高性能C#集合,c#,multithreading,.net-core,C#,Multithreading,.net Core,我处于一个大规模并行环境中,有一个大型(大量大型对象)静态集合 我找不到任何不强制数据一致性的集合实现。他们都试图使用内部锁定、版本控制(例如:List)或本地复制(例如:ConcurrentBag)来强制执行它 List工作得很好,但是使用版本化并抛出一个invalidooperation\u EnumFailedVersion ConcurrentBag显示我的代码性能下降。它是GC密集型的,并假设生产者/消费者模式。为了数据一致性的目的,它在包的“快照”(ThreadLocal)上迭代,

我处于一个大规模并行环境中,有一个大型(大量大型对象)静态集合

我找不到任何不强制数据一致性的集合实现。他们都试图使用内部锁定、版本控制(例如:List)或本地复制(例如:ConcurrentBag)来强制执行它

  • List
    工作得很好,但是使用版本化并抛出一个
    invalidooperation\u EnumFailedVersion
  • ConcurrentBag
    显示我的代码性能下降。它是GC密集型的,并假设生产者/消费者模式。为了数据一致性的目的,它在包的“快照”(ThreadLocal)上迭代,但内存有限
  • 我检查了上述两个集合的
    netframework
    netcore
    源代码
我需要一个具有以下功能的集合:

  • 任何时候都不要隐式锁定。我自己锁
  • 不要抛出任何异常,因为我正在读取的数据可能不一致(非原子操作),我知道,这是正常的
  • 不要复制自己
  • 需要是可变的
  • 需要能够添加/删除元素(可能需要显式锁,对于这种罕见的情况,我可以使用锁)
  • 编译时大小未知,最大大小为“直到系统内存耗尽和程序崩溃”。(无阵列)
  • 可与foreach和Parallel.foreach一起使用
  • 不需要订购
  • 可以由多个线程读取,可以由多个线程写入,所有这些都可以同时进行。不管任何可能的数据一致性问题。(不得在内部使用“版本”)
LinkedList
很有希望,但从源代码()来看,它似乎具有与List相同的“版本”一致性保护:

我需要创建自己的实现吗

您仍然可以使用,并使用
for
循环枚举它,处理可能发生的任何
ArgumentOutOfRangeException
异常:

public static IEnumerable<T> AsInconsistentEnumerable<T>(this List<T> list)
{
    for (int i = 0; i < list.Count; i++)
    {
        T current;
        try
        {
            current = list[i];
        }
        catch (ArgumentOutOfRangeException)
        {
            yield break;
        }
        yield return current;
    }
}

关于此集合的大小,通过在App.config中配置该选项,您可以在64位平台上增加20亿个元素()。

听起来不错,因为
for
不枚举(afaik),它不会触发版本控制检查。。。大概:)
public static IEnumerable<T> AsInconsistentEnumerable<T>(this List<T> list)
{
    for (int i = 0; i < list.Count; i++)
    {
        T current;
        try
        {
            current = list[i];
        }
        catch (ArgumentOutOfRangeException)
        {
            yield break;
        }
        yield return current;
    }
}
foreach (var item in myList.AsInconsistentEnumerable())
{
    //...
}