代码之家  ›  专栏  ›  技术社区  ›  almog.ori

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

  •  0
  • almog.ori  · 技术社区  · 16 年前

    如果声明静态事件处理程序的类的一个实例将包含对已向相关事件处理程序注册的其他类的引用,并且这些类都是静态的,那么在ASP中,用户会话之间是否会有任何争用(我是指他/她在某个时间点上使用系统)。网

    下面是一个例子,从blogengine.net中提取

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

    saved是静态的到class post,这个事件会在整个显示中被使用,其他用户的会话会看到post saved事件吗,因为它是静态的?在声明静态事件时,我应该注意哪些线程问题?

    1 回复  |  直到 16 年前
        1
  •  5
  •   EMP    16 年前

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

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

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