C# 从应用程序读取数据:与多个用户冲突?

C# 从应用程序读取数据:与多个用户冲突?,c#,.net,C#,.net,我注意到这个问题:如果我在.NET 3.5/C上的应用程序中存储一个对象,那么: 许多用户试图获取并迭代(使用foreach)我可能会遇到一些麻烦:迭代有时会失败,丢失一些数据,并返回错误的结果 我读到在.NET应用程序上有很多这样的问题,但我不知道如何解决 我如何解决这个问题 编辑 此崩溃发生在以下数据上: var Example = from MyCollection collection in MyObject.Collections select colle

我注意到这个问题:如果我在.NET 3.5/C上的应用程序中存储一个对象,那么:

许多用户试图获取并迭代(使用foreach)我可能会遇到一些麻烦:迭代有时会失败,丢失一些数据,并返回错误的结果

我读到在.NET应用程序上有很多这样的问题,但我不知道如何解决

我如何解决这个问题

编辑 此崩溃发生在以下数据上:

var Example = from MyCollection collection in MyObject.Collections
               select collection;
这是
System.Collections.Generic.IEnumerable

在object
ctx.Application[“object”]
上有一些集合,其中许多集合(崩溃的集合)是System.collections.Generic.IEnumerable。如果userA迭代一个集合(存储在MyObject中),同时userB迭代同一个集合,userA可能会错过该集合中的一些值,userB可能会获得该集合的重复值

我不能精确地说有多少以及哪些值是未命中/重复的,因为这是一个细化问题。这就是我所说的“返回不正确的结果”


不,我只读取数据,在读取过程中我不会对这些集合进行任何更改/编辑/添加。

我不确定IEnumerable如何一次处理多个循环,但它似乎做得不太好,因为每个人只有一个枚举器。在循环之前尝试对象,因此每个线程都将等待,直到另一个线程结束循环。

基于有限的信息,这听起来像一个经典的“变异共享对象”问题。对此的修复可以很简单:

选项1:永远不要更改共享对象。如果需要更改,请制作一个深度副本(但使用更改的值),然后将其替换为存储值:

ctx.Application[key] = newValue;
与此相结合,所有读卡器只能获取对象一次,并且必须在其请求期间重复使用此快照,以避免一致状态

选项2:使用独占锁或协作锁执行复杂同步(如读/写器,在大多数访问为只读时很有用)


第一种方法比较简单,建议使用,但如果数据变化快或非常大,则可能会产生开销。第二个更复杂,也更难正确处理,但完美地完成
可以降低开销。

您不应该在请求之间共享可变对象。是否有线程在处理/修改/更改MyObject中的值?我知道,但对于所有用户来说,许多数据都是相同的。这就是为什么我想用它们…@Marc Gravell♦ : 不,它们是/必须是只读的(事实上我只获取数据)。问题是当我在foreach上循环它们时,正如我所说的。对于每个MyObject都有一个迭代器,而此崩溃…您的编辑不是有效的c#,因此它无法帮助我们理解。。。再次强调:大规模并行迭代没有本质上的错误;任何正在发生的事情听起来都很奇怪,这是我们看不到的。。。也许您可以澄清当它“返回错误的结果@时会发生什么情况?并确认:您是否在任何时候添加/删除/更改列表中的值?这可能是一个完全不同的请求;它仍然会导致您不确定您的第一个解决方案!事实上,我是在应用程序上这样做的。问题是循环一个IEnumerable(在MyObject中)使用for-each:迭代器崩溃,我不知道。你知道如何解决这个问题吗?@markzzz,直到你告诉我们可枚举项的底层实现是,我们怎么可能回答?定义行为的底层实现在一般情况下是不可能注释的,但通常可枚举项是eiThere“once only”(仅一次)或“尽可能多”(只要不更改)。没有通常会在某些时候影响可枚举序列的固有问题
ctx.Application[key] = newValue;