带事件的共享对象

时间:2012-11-16 15:54:34

标签: c# asp.net .net events

目前我有一个对象,其中包含大量项目(在运行时不会更改)占用大量内存,此对象将用于多个会话(每个用户),并且应该相同每一个。

因此,我决定将其用作共享资源,而不是复制大对象或在每个会话中创建新实例。这样每个会话都将从对象的列表中读取以获取项目并执行它们需要执行的操作。我想节省内存,因为这是一个Web应用程序。

但是,列表中的这些项目也有事件,每个会话都需要订阅这些事件。

所以会发生什么是当一个item事件被触发时,它会在所有会话中触发它。因此,我必须添加一些逻辑来检查哪个会话触发了此事件,并仅将其用于该会话。

有更好的方法吗?一种更有效的方式?我担心,如果我收到大量的用户会话,那么当这些共享项目触发事件时,这将真正陷入困境。

你有什么想法?另外值得注意的是,在处理这些“项目”时,无法知道每个项目需要多长时间,因此我倾向于使用事件。

1 个答案:

答案 0 :(得分:0)

  

所以会发生什么是当一个item事件被触发时,它会触发它   会话。所以我不得不添加一些逻辑来检查哪个会话   解雇此事件并仅将其用于该会话。

这意味着只要请求启动最终触发该事件的操作,共享数据中的事件仍会被触发,但是您可以阻止事件冒泡到每个会话。但是,这意味着在共享数据和所有会话之间创建了事件处理程序。

  

有更好的方法吗?一种更有效的方式?我很害怕   如果我得到大量的用户会话,这将真的很糟糕   在对这些共享项目触发事件时进行处理。

您的解决方案确实存在一些问题。由于在会话和共享数据之间创建了事件处理程序,因此在会话到期时不能对会话对象进行垃圾回收(我假设您在会话执行时没有清除事件处理程序,如果我'我错了)。后果:内存泄漏。

  

你有什么想法?另外值得注意的是,在处理这些"项目"时,   没有办法知道每个人需要多长时间,因此我倾向于   使用事件。

我不确定我明白你的意思。当你不知道每个人需要多长时间时,为什么事件会解决问题?事件及其事件处理程序仍然按顺序执行。

我担心我无法为此提供更好的解决方案,因为我不清楚会话应用之间如何共享共享数据。您已经提到了共享数据中的事件,但它们是如何工作的?您已经提到事件应该只由发起操作的会话处理,因此我认为一个解决方案是在启动共享数据操作时为共享数据callback function。然后可以在必要时调用回调函数,这样就不会创建将会话对象绑定到共享数据的事件处理程序,因此垃圾收集应该不是问题。