C# 集合被修改,datatable.Copy()上出现异常

C# 集合被修改,datatable.Copy()上出现异常,c#,.net,thread-safety,C#,.net,Thread Safety,调用datatable.Copy()时出现以下异常,我不确定原因。我应用了一个锁来避免这个问题,但它似乎没有解决它。这种异常不会一直发生,所以我知道它与线程有关。我是不是误解了锁的工作原理 System.InvalidOperationException:集合已修改;枚举操作可能无法执行。 在System.Data.RBTree`1.RBTreeEnumerator.MoveNext()处 在System.Data.DataTable.Copy()处 代码: ClassName是一种类型,而不是

调用
datatable.Copy()
时出现以下异常,我不确定原因。我应用了一个锁来避免这个问题,但它似乎没有解决它。这种异常不会一直发生,所以我知道它与线程有关。我是不是误解了锁的工作原理

System.InvalidOperationException:集合已修改;枚举操作可能无法执行。 在System.Data.RBTree`1.RBTreeEnumerator.MoveNext()处 在System.Data.DataTable.Copy()处

代码:


ClassName
是一种类型,而不是一个对象(在我之前的一个问题中有一些混淆)。

根据注释判断,您误解了
锁的工作原理。这是一种协作方案,两个线程不能同时在同一个监视器上持有锁。除非一个线程尝试使用
lock
语句或(和相关调用)“进入”锁,否则另一个线程持有锁的事实是无关的

这有点像一个没有锁的浴室,但有一个“订婚”或“空置”的标志。。。没有人被强迫自己改变标志或注意其当前状态。。。但如果每个人都同意同时做这两件事,你就可以避免尴尬的局面

就我个人而言,我尽量避免锁定任何其他代码都可以看到的监视器,因此我可能会:

private readonly object tableLock = new objet();
private readonly DataTable table;

...

lock (tableLock)
{
    ...
}

您至少需要在使用表的任何地方潜在地获取锁-当然,如果您将它传递给其他可能存储对它的引用的方法,或者其他代码为您提供了锁,你真的无法控制它会发生什么。

你是否在任何地方都使用相同的锁使用修改或读取表?不,我想我不会。lock()是否只针对其他lock()块进行锁定?如果是这样的话,那可能是我的错误。是的,是的。(好的,或者调用
Monitor。为同一个监视器输入
。)在继续之前,需要非常清楚
lock
的作用。你想让我添加这个(更详细一点)作为答案吗?是的。在我花时间修理之前,我想确定我知道要修理什么。这也是值得学习的,因为我不认为线程很快就会消失。
private readonly object tableLock = new objet();
private readonly DataTable table;

...

lock (tableLock)
{
    ...
}