2009-11-08 33 views
0

任何人都可以向我解释什么时候发生什么事情当一个类的实例声明静态事件处理程序将持有引用其他类已注册意图的事件处理程序的问题,因为他们是所有静态会有在asp.net静态事件处理程序,线程等

下面有一个例子用户会话之间的任何竞争(我的意思是在一个时间点的系统的他/她的使用),从BlogEngine.Net

Post.Saved += new EventHandler<SavedEventArgs>(Post_Saved); 

提取已保存的课程帖子是静态的,此活动在整个演出中都会消耗殆尽,另一个用户的会话将看到帖子保存的活动罪恶它是静态的吗?在声明静态事件时,我应该注意哪些线程问题?

回答

5

当多个事件处理程序被注册,因为是事件(据我所知)顺序运行(在顺序对其进行连接的),不是同时。所以不应该有任何并发​​问题。

如果事件是静态的则是,所有用户会话会认为这是他们在同一个.NET AppDomain中运行。 (我相信通过“会话”你的意思是一个ASP.NET会话)。

主要的事情要注意与静态事件是内存泄漏。如果你的事件处理程序是一个实例方法,并将它附加到一个静态事件中,那么该静态事件现在有一个对处理程序被声明的对象的引用,所以它引用的对象和任何东西都将保留在内存中,直到事件处理程序被分离或者代码运行的整个AppDomain被卸载。因为这个原因,你不得不小心处理不再需要的事件处理程序,或者至少确保你的事件处理类没有引用其他任何东西,所以内存泄漏是最小的。