【问题标题】:static event handlers, threading and the like静态事件处理程序、线程等
【发布时间】:2009-11-08 09:09:06
【问题描述】:
任何人都可以向我解释当声明静态事件处理程序的类的实例将持有对已向相关事件处理程序注册意图的其他类的引用时发生了什么,因为它们都是静态的,之间是否会有任何争用asp.net 中的用户会话(我的意思是他/她在某个时间点对系统的使用)
这是一个例子,摘自 BlogEngine.Net
Post.Saved += new EventHandler<SavedEventArgs>(Post_Saved);
已保存对于类帖子是静态的,此事件在整个节目中都会被消耗,另一个用户的会话是否会看到帖子已保存事件,因为它是静态的?在声明静态事件时我应该注意哪些线程问题?
【问题讨论】:
标签:
asp.net
static
event-handling
multithreading
【解决方案1】:
当为一个事件注册多个事件处理程序时,它们(据我所知)按顺序运行(按照它们附加的顺序),而不是同时运行。所以不应该有任何并发问题。
如果事件是静态的,那么是的,所有用户会话都会看到它,因为它们在同一个 .NET AppDomain 中运行。 (我认为“会话”是指 ASP.NET 会话。)
使用静态事件要注意的主要事情是内存泄漏。如果您的事件处理程序是一个实例方法并且您将它附加到一个静态事件,那么该静态事件现在具有对声明处理程序的对象的引用,因此该对象及其引用的任何内容都将保留在内存中,直到事件处理程序已分离或运行代码的整个 AppDomain 已卸载。因此,您必须小心在不再需要事件处理程序时将其分离,或者至少确保您的事件处理类不引用其他任何内容,这样内存泄漏就会最小化。