2011-12-27 70 views
0

我注意到这个问题:如果我存储在应用程序中的对象上的.NET 3.5/C#为:从应用程序读取数据:与许多用户冲突?

HttpContext ctx = HttpContext.Current; 
if (ctx.Application["object"] == null) 
    ctx.Application["object"] = new MyObject(); 

return (MyObject)ctx.Application["object"]; 

许多用户设法得到它并重复它(在foreach)我可以得到一些麻烦:迭代有时会失败,错过一些数据,并返回不正确的结果。

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

我该如何解决这个问题?

EDIT

这个崩溃像数据:

var Example = from MyCollection collection in MyObject.Collections 
       select collection; 

这是System.Collections.Generic.IEnumerable<T>

那么,在对象ctx.Application["object"]有一些集合,并且其中很多(崩溃的)是System.Collections.Generic.IEnumerable。如果userA迭代一个集合(存储在MyObject中),同时userB遍历相同的集合,则userA可能会遗漏集合中的某些值,并且userB可能会获得该集合的重复值。

我不能精确说值多少,哪些是思念/重复,因为它是一个阐述的问题。这就是我所说的“返回不正确的结果”。

不,我只读数据,我不改变/编辑/读取过程中添加任何东西到这个集合。

+0

你不应该通过请求共享可变对象。 – SLaks 2011-12-27 15:15:20

+0

任何线程操纵/变异/更改* MyObject中的值* – 2011-12-27 15:16:01

+0

我知道,但所有用户的许多数据都是一样的。这就是为什么我想使用它们...... – markzzz 2011-12-27 15:16:40

回答

1

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

+0

它是不可能在一般情况下发表评论,但通常一个可枚举的项目或者是“只有一次”或者“只要你喜欢”(只要它没有改变)。没有固有的问题会影响一个可枚举的序列**一些**的时间 – 2011-12-27 15:25:27

1

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

选项1:永不改变共享对象。如果你需要改变它,使深层副本(但与更改后的值),然后交换,对于卖场值:

ctx.Application[key] = newValue; 

与此结合所有的读者只能获取对象只有一次,并且必须在其请求期间重新使用此快照,以避免一致状态。

选项2:执行复杂的同步,与任一独占锁或合作锁(诸如读/写器,有用的,如果大多数访问是只读的)

首先是简单和推荐的,但可以具有在数据开销正在快速变化或非常大。第二个是更复杂,更难以得到正确的,但做得很好可以降低开销。

+0

不知道你的第一个解决方案!事实上,我在Application上这样做。问题是循环IEnumerable(在MyObject中),每个都有一个:迭代器崩溃,我不知道。你知道如何解决这个问题吗? – markzzz 2011-12-27 15:23:28

+1

@markzzz,直到你告诉我们那个枚举的底层实现是,我们怎么可能回答?它是定义行为的底层实现 – 2011-12-27 15:27:07

+0

更新安装程序!希望这会帮助你理解我的问题... – markzzz 2011-12-27 15:34:59

相关问题