C#当多个线程以相同的时间间隔将数据插入列表时发生OutOfMemoryException

C#当多个线程以相同的时间间隔将数据插入列表时发生OutOfMemoryException,c#,multithreading,memory,C#,Multithreading,Memory,我遇到了一个奇怪的现象,当线程(几乎同时启动)在插入数据之前睡眠相同且固定的时间时,就会发生异常。但是,如果在插入数据之前,他们每个人都随机睡眠一段时间,那么内存就不会发生异常。这种情况反复发生 每次崩溃时,列表中的项目不超过2000个(每个项目只有10个字节)。这似乎没有超过内存限制 如果每个线程都像这样休眠: Thread.Sleep((int)((new Random(DateTime.Now.Second)).NextDouble() * 10000)); 如果睡眠时间相同且固定,则不

我遇到了一个奇怪的现象,当线程(几乎同时启动)在插入数据之前睡眠相同且固定的时间时,就会发生异常。但是,如果在插入数据之前,他们每个人都随机睡眠一段时间,那么内存就不会发生异常。这种情况反复发生

每次崩溃时,列表中的项目不超过2000个(每个项目只有10个字节)。这似乎没有超过内存限制

如果每个线程都像这样休眠:

Thread.Sleep((int)((new Random(DateTime.Now.Second)).NextDouble() * 10000));
如果睡眠时间相同且固定,则不会使应用程序崩溃:

Thread.Sleep(6000);
它会崩溃的

更新: 抱歉信息不完整,谢谢您的回答。 在编辑列表时(无论何时何地),我都有一个储物柜

我用我真正耗时的工作代替了“睡觉”(显然完成时间不同),OutOfMemory异常再也没有发生过

这是一个抽象的问题: 一些线程(大约30个)在同一时间(几乎)启动并同时休眠,然后在同一时间(几乎)使用列表(带锁)执行某些操作。它将导致OutOfMemoryException。 但如果让它少一些同时性(不同时间的睡眠/工作),就可以了

是的,高的同时性会导致一些问题,但为什么会导致内存溢出呢?只有30个线程,每个线程只更新列表中的几个字节。 谢谢


很抱歉,堆栈跟踪信息丢失:(

您使用的列表类型不是线程安全的。您可以将添加和访问代码设置为线程安全的,也可以使用线程安全的列表类型。无代码(类型)很难说您应该做什么。

您使用的列表类型不是线程安全的。您可以将添加和访问代码设置为线程安全的,也可以使用线程安全的列表类型。无代码(类型)很难说您应该做什么。

您使用的列表类型不是线程安全的。您可以将添加和访问代码设置为线程安全的,也可以使用线程安全的列表类型。无代码(类型)很难说您应该做什么。

您使用的列表类型不是线程安全的。您可以将添加和访问代码设置为线程安全的,也可以使用线程安全的列表类型。无代码(类型)很难说你应该怎么做。

显然,当所有线程都试图同时更新列表时,插入代码中有某种东西会导致高内存负载。可能是某种锁定机制?或者任何试图将数据插入可能锁定的资源的递归或循环?

显然,ins中有某种东西当所有线程尝试同时更新列表时,插入导致高内存负载的代码。可能是某种锁定机制?或任何试图将数据插入可能锁定的资源的递归或循环?

显然,当所有线程尝试更新列表时,插入代码中存在导致高内存负载的内容同时。可能是某种锁定机制?或任何试图将数据插入可能锁定的资源的递归或循环?

显然,当所有线程尝试同时更新列表时,插入代码中的某些内容会导致高内存负载。可能是某种锁定机制?或任何试图插入的递归或循环将数据导入可能已锁定的资源?

问题是多个线程同时访问同一元素,这会导致不可预测的错误。要同步线程,请尝试以下方法

lock(yourListObject)
{
   yourListObject.InsertData(data);
}

编辑:您应该查看

问题是多个线程同时访问同一元素,这会导致不可预测的错误。要同步线程,请尝试以下操作

lock(yourListObject)
{
   yourListObject.InsertData(data);
}

编辑:您应该查看

问题是多个线程同时访问同一元素,这会导致不可预测的错误。要同步线程,请尝试以下操作

lock(yourListObject)
{
   yourListObject.InsertData(data);
}

编辑:您应该查看

问题是多个线程同时访问同一元素,这会导致不可预测的错误。要同步线程,请尝试以下操作

lock(yourListObject)
{
   yourListObject.InsertData(data);
}

编辑:您应该查看

尝试使用替代列表查看您的问题是否来自列表上的并发访问。

尝试使用替代列表查看您的问题是否来自列表上的并发访问。

尝试使用替代列表查看您的问题是否来自列表上的并发访问。

尝试使用替代列表查看问题是否来自列表上的并发访问。

请发布复制问题的最小代码。如果要创建伪随机数,应创建
random
类的单个实例,然后重复调用
NextDouble
。代码生成的数字只会每次更改其次,
OutOfMemoryException
的堆栈跟踪是什么?您使用的是什么类型的列表?
list
?什么是
T
(元素类型)?尤其是
T
是值或引用类型吗?如何向列表中添加元素?使用了多少线程?请发布复制问题的最小代码。如果要创建伪随机数,应创建
random
类的单个实例,然后重复调用
NextDouble
代码生成的e编号只会每秒更改一次。
OutOfMemoryException
的堆栈跟踪是什么?您使用的列表类型是什么?
list
?什么是
T
(元素类型)?尤其是
T
是值或引用类型吗?如何向列表中添加元素?使用了多少线程?请发布复制问题的最小代码。如果要创建伪随机数,应创建
random
类的单个实例,然后重复调用
NextDouble
代码生成的e编号只会每秒更改一次。OutOfMemoryException的堆栈跟踪是什么?您使用的列表类型是什么