1

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

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

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

因此,当一个项目事件被触发时,它会在所有会话中触发它。所以我不得不添加一些逻辑来检查哪个会话触发了这个事件并且只将它用于那个会话。

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

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

4

1 回答 1

0

因此,当一个项目事件被触发时,它会在所有会话中触发它。所以我不得不添加一些逻辑来检查哪个会话触发了这个事件并且只将它用于那个会话。

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

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

您的解决方案确实会带来一些问题。由于事件处理程序是在会话和共享数据之间创建的,因此会话到期时无法对会话对象进行垃圾收集(我在这里假设您在会话到期时不清理事件处理程序,如果我错了请纠正我)。结果:内存泄漏。

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

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

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

于 2012-11-16T18:31:13.533 回答