.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 管理着,维护着一个池。所以 那些被注册的事件也被缓存着,这样就节省了内存开销。
在命名空间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 管理着,维护着一个池。所以 那些被注册的事件也被缓存着,这样就节省了内存开销。
相关文章推荐
- ASP.NET处理用户请求的流程 IHttpModule , IHttpHandler 管道事件
- .NET 请求、事件 处理流程
- .NET组件程序设计 第8章 多线程和并发管理 同步线程_可等待事件
- ASP.NET AJAX 添加请求处理事件来防止按钮重复提交
- 关于委托、事件、处理事件的方法以及.NET 续一个实例
- 基于管道化和事件驱动模型的Web请求处理(二)
- asp.net Page事件处理管道
- IE6下链接onclick事件处理中的请求被aborted
- web developer tips (43):通过请求处理管道注册IHttpModule
- C++ FastDelegate 扩展,实现与.net类似的事件处理功能
- SODBASE CEP事件驱动应用----进行告警处理流程管理
- 学习ASP.NET Core,怎能不了解请求处理管道[2]: 服务器在管道中的“龙头”地位
- Android官方开发文档Training系列课程中文版:手势处理之ViewGroup的事件管理
- .NET Remoting中的事件处理
- 一起谈.NET技术,ASP.NET Routing对请求的处理方式
- .NET漫游指南-011-.NET Framework中处理和引发事件
- 学习ASP.NET Core, 怎能不了解请求处理管道[5]: 中间件注册可以除了可以使用Startup之外,还可以选择StartupFilter
- .Net事件管道详解图
- IE6下链接onclick事件处理中的请求被aborted
- [.NET领域驱动设计实战系列]专题七:DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能