静态事件处理程序,线程等

时间:2009-11-08 09:09:07

标签: asp.net static event-handling multithreading

任何人都可以向我解释当声明一个静态事件处理程序的类的实例将引用已经注册了有关事件处理程序的意图的其他类的引用时发生了什么,因为它们都是静态的,它们之间是否存在任何争用用户会话(我的意思是他/她在某个时间点使用系统)在asp.net

以下是一个例子,摘自BlogEngine.Net

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

已保存为类帖子是静态的,此事件在整个节目中被消耗,另一个用户的会话是否会看到保存的事件,因为它是静态的?在声明静态事件时我应该注意哪些线程问题?

1 个答案:

答案 0 :(得分:5)

当为一个事件注册了多个事件处理程序时,它们(据我所知)按顺序运行(按照它们所附的顺序),而不是同时运行。所以不应该有任何并发​​问题。

如果事件是静态的,那么所有用户会话都将看到它,因为它们在同一个.NET AppDomain中运行。 (我认为“会话”是指ASP.NET会话。)

要注意静态事件的主要问题是内存泄漏。如果您的事件处理程序是一个实例方法,并且您将它附加到静态事件,那么该静态事件现在具有对声明处理程序的对象的引用,因此该对象及其引用的任何内容将保留在内存中,直到事件处理程序为止。是分离的,或卸载运行代码的整个AppDomain。因此,您必须小心在不再需要时分离事件处理程序,或者至少确保您的事件处理类没有引用任何其他内容,因此内存泄漏很少。