您的位置:首页 > 其它

.net 请求处理管道中的事件管理

2012-02-21 10:01 323 查看
asp.net 请求处理管道的原理是使用了多个事件,然后依次触发,把请求的处理过程通过事件的方式暴露给程序员,以便程序员在某个步骤做一些处理动作。事件固然很好,但是如果事件很多的话,每次请求都要创建那么多的事件,内存的开销会增大,为了解决这个问题,微软使用了事件的字典来存储已经注册的事件。

在命名空间system.componentModel下有一个类:Component。该类有一个属性:Events,类型是:system.componentModel.EventHandlerList 类型。它管理着一个事件的集合,通过方法:AddHandler ,RemoveHandler 和 索引this[object key] 类管理这个事件集合。这是一个字典集合,key 是object类型,value 是delegate类型。

您可以这样使用Component类。 定义一个类继承Component,在类中定义一些事件和对应的Key,代码如下:

/// <summary>

/// 要实现事件列表管理的类

/// </summary>

class ProcessPipeline:System.ComponentModel.Component

{

#region

private static readonly object startEvent = new object();

private static readonly object preProcessEvent = new object();

private static readonly object postProcessEvent = new object();

private static readonly object endEvent = new object();

public delegate void MsgHandler(string msg);

#endregion

#region

public event MsgHandler StartProcess

{

add { this.Events.AddHandler(startEvent, value); }

remove { this.Events.RemoveHandler(startEvent, value); }

}

public event EventHandler PreProcess

{

add { this.Events.AddHandler(preProcessEvent, value); }

remove { this.Events.RemoveHandler(preProcessEvent, value); }

}

public event EventHandler PostProcess

{

add

{

this.Events.AddHandler(postProcessEvent, value);

}

remove { this.Events.RemoveHandler(postProcessEvent, value); }

}

public event EventHandler EndProcess

{

add { this.Events.AddHandler(endEvent, value); }

remove { this.Events.RemoveHandler(endEvent, value); }

}

#endregion

protected void OnStartProcess(EventArgs e)

{

if (this.Events[startEvent]!=null)

{

(this.Events[startEvent] as MsgHandler)("我是另一个委托,哈哈");

}

}

protected void OnPreProcess(EventArgs e)

{

if (this.Events[preProcessEvent] != null)

{

(this.Events[preProcessEvent] as EventHandler)(this, e);

}

}

protected void OnPostProcess(EventArgs e)

{

if (this.Events[postProcessEvent] != null)

{

(this.Events[postProcessEvent] as EventHandler)(this, e);

}

}

protected void OnEndProcess(EventArgs e)

{

if (this.Events[endEvent] != null)

{

(this.Events[endEvent] as EventHandler)(this, e);

}

}

public void Process()

{

Console.WriteLine("开始处理请求");

OnStartProcess(EventArgs.Empty);

Console.WriteLine("准备处理请求");

OnPreProcess(EventArgs.Empty);

Console.WriteLine("正在处理中...");

OnPostProcess(EventArgs.Empty);

Console.WriteLine("请求处理完成");

OnEndProcess(EventArgs.Empty);

Console.WriteLine("管道处理结束");

}

}

然后在主程序中依次注册这几个事件并,调用该类的处理方法(Process();)

static void Main(string[] args)

{

ProcessPipeline pp = new ProcessPipeline();

pp.StartProcess += new ProcessPipeline.MsgHandler(pp_StartProcess);

pp.PreProcess += new EventHandler(pp_PreProcess);

pp.PostProcess += new EventHandler(pp_PostProcess);

pp.EndProcess += new EventHandler(pp_EndProcess);

pp.Process();

Console.Read();

}

static void pp_StartProcess(string msg)

{

Console.WriteLine(msg);

}

static void pp_EndProcess(object sender, EventArgs e)

{

Console.WriteLine("正在结束请求处理...");

}

static void pp_PostProcess(object sender, EventArgs e)

{

Console.WriteLine("正在进行请求处理...");

}

static void pp_PreProcess(object sender, EventArgs e)

{

Console.WriteLine("正在准备请求处理...");

}

因为HttpApplication 对象由 HttpApplicationFactory 管理着,维护着一个池。所以 那些被注册的事件也被缓存着,这样就节省了内存开销。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: