欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » ASP.Net » 正文

热门阅读

Asp.Net中的事件集合(Events属性)处理与模拟处理管道

创建时间:2011年09月22日 15:40  阅读次数:(5601)
分享到:
我们先来了解一下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
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 46+53=? 的结果(结果是:99)
结  果: