我们先来了解一下Events属性与处理管道两个概念:
一、
Events属性我们都知道,事件其实就是一个受限制的委托成员,那么我们在创建事件的时候,就会占用一定的存储空间。但我们在做富控件的自定义控件时,往往会暴露出大量的事件给调用者。这样,就意味着即使这些事件调用者没有用到,也需要更多的存储空间来创建这些事件。
针对这个问题,.net提供了处理多个事件的基础:Events属性。该属性是一个线性字典,位于System.ComponentModel.Component类下,类型是System.ComponentModel.EventHandlerList。需要一个事件,我们就通过一个key将事件保存到Event中,不需要的时候,通过Event的RemoveHandler方法将该事件移出属性中。以后需要调用某事件时,就可以通过key来访问Events集合中的事件。这样就可以节省大量事件对空间的占用。
二、
处理管道处理管道,就是在处理一个复杂的问题时候,将过程分成多个步骤,一步一步来执行。这有点类似于生产产线上的流水作业。在.net中,这种处理方式就称为处理管道。这样做的好处是:
1,不会使一个方法太臃肿,处理更简捷易懂。
2,在每个步骤中,我们都可以暴露事件给程序员,这样可以让程序员在每个步骤添加自己的处理逻辑,这样才够灵活。
下面,我们通过一个示例来理解以上两个概念:
先声明类,并暴露多个事件,
using System;
using System.Collections.Generic;
using System.Web;
namespace WebApplication1
{
public class Class1 : System.ComponentModel.Component
{
//先申明各事件的key
private static readonly object obj_start = new object();
private static readonly object obj_processing = new object();
private static readonly object obj_end = new object();
//通过Events属性申明事件
public event EventHandler eventStart
{
add { this.Events.AddHandler(obj_start, value); }
remove { this.Events.RemoveHandler(obj_start, value); }
}
public event EventHandler eventProcessing
{
add { this.Events.AddHandler(obj_processing, value); }
remove { this.Events.RemoveHandler(obj_processing, value); }
}
public event EventHandler eventEnd
{
add { this.Events.AddHandler(obj_end, value); }
remove { this.Events.RemoveHandler(obj_end, value); }
}
//创建各事件对应方法
protected void OnEventStart(EventArgs e)
{
if (this.Events[obj_start] != null)
{
(this.Events[obj_start] as EventHandler)(this, e);
}
}
protected void OnEventProcessing(EventArgs e)
{
if (this.Events[obj_processing] != null)
{
(this.Events[obj_processing] as EventHandler)(this, e);
}
}
protected void OnEventEnd(EventArgs e)
{
if (this.Events[obj_end] != null)
{
(this.Events[obj_end] as EventHandler)(this, e);
}
}
//执行事件,摸拟处理管道
public void Process()
{
OnEventStart(EventArgs.Empty);
OnEventProcessing(EventArgs.Empty);
OnEventEnd(EventArgs.Empty);
}
}
}
调用上面类:
namespace WebApplication1
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Class1 class1 = new Class1();
class1.eventStart += new EventHandler(class1_eventStart);
class1.eventProcessing += new EventHandler(class1_eventProcessing);
class1.eventEnd += new EventHandler(class1_eventEnd);
class1.Process();
}
void class1_eventStart(object sender, EventArgs e)
{
Response.Write("<br / >这是处理开始事件!");
}
void class1_eventProcessing(object sender, EventArgs e)
{
Response.Write("<br / >这是处理中事件!");
}
void class1_eventEnd(object sender, EventArgs e)
{
Response.Write("<br / >这是处理结束事件!");
}
}
}
输出结果:
这是处理开始事件!
这是处理中事件!
这是处理结束事件!n