?? 設計模式(事件)-版本1(簡單).txt
字號:
線程框架(設計模式)-版本1(簡單)
1.CodeFile1.cs
using System;
using System.Collections;
using System.Runtime.CompilerServices;
namespace Movecont
{
class TypeWithLotsOfEvents
{
protected EventHandlerSet eventSet=EventHandlerSet.Synchronized(new EventHandlerSet());
//第一個事件(Foo)定義必要的成員
protected static readonly object fooEventKey=new object();
public class FooEventArgs:EventArgs{}
public delegate void FooEventHandler(object sender,FooEventArgs e);
public event FooEventHandler Foo
{
add{eventSet.AddHandler(fooEventKey,value);}
remove{eventSet.RemoveHandler(fooEventKey,value);}
}
protected virtual void OnFoo(FooEventArgs e)
{
eventSet.Fire(fooEventKey,this,e);
}
public void SimulateFoo()
{
OnFoo(new FooEventArgs());
}
//第二個事件(Bar)定義必要的成員
protected static readonly Object barEventKey=new object();//多個實例是節省內存
public class BarEventArgs:EventArgs{}
public delegate void BarEventHandler(Object sender,BarEventArgs e);
public event BarEventHandler Bar
{
add{eventSet.AddHandler(barEventKey,value);}
remove{eventSet.RemoveHandler(barEventKey,value);}
}
protected virtual void OnBar(BarEventArgs e)
{
eventSet.Fire(barEventKey,this,e);
}
public void SimulateBar()
{
OnBar(new BarEventArgs());
}
}
//尋呼機
class Pager
{
//訂閱事件
public Pager(TypeWithLotsOfEvents mm)
{
//(使用了事件,委托,回調方法)
mm.Bar+=new TypeWithLotsOfEvents.BarEventHandler(PagerMsg);
}
//回調方法
private void PagerMsg(Object sender,TypeWithLotsOfEvents.BarEventArgs e)
{
Console.WriteLine("Pagering mail message!");
}
//注銷事件
public void Unregister(TypeWithLotsOfEvents mm)
{
TypeWithLotsOfEvents.BarEventHandler callback=new TypeWithLotsOfEvents.BarEventHandler(PagerMsg);
mm.Bar-=callback;
}
}
//管理事件/委托對
public class EventHandlerSet:IDisposable
{
private Hashtable events=new Hashtable();//散列表
public virtual Delegate this[Object eventKey]//索引器
{
get
{
return (Delegate)events[eventKey];
}
set
{
events[eventKey]=value;
}
}
public virtual void AddHandler(Object eventKey,Delegate handler)//添加
{
events[eventKey]=Delegate.Combine((Delegate)events[eventKey],handler);
}
public virtual void RemoveHandler(Object eventKey,Delegate handler)//移除
{
events[eventKey]=Delegate.Remove((Delegate)events[eventKey],handler);
}
public virtual void Fire(Object eventKey,object sender,EventArgs e)//觸發事件
{
Delegate d=(Delegate)events[eventKey];
if(d!=null)
d.DynamicInvoke(new object[]{sender,e});
}
public void Dispose()//釋放資源
{
events=null;
}
public static EventHandlerSet Synchronized(EventHandlerSet eventHandlerSet)
{
if(eventHandlerSet==null)
throw new ArgumentNullException("eventHandlerSet");
return new SynchronizedEventHandlerSet(eventHandlerSet);
}
//線程安全
private class SynchronizedEventHandlerSet:EventHandlerSet
{
private EventHandlerSet eventHandlerSet;
public SynchronizedEventHandlerSet(EventHandlerSet eventHandlerSet)
{
this.eventHandlerSet=eventHandlerSet;
Dispose();
}
public override Delegate this[Object eventKey]
{
[MethodImpl(MethodImplOptions.Synchronized)]
get
{
return eventHandlerSet[eventKey];
}
[MethodImpl(MethodImplOptions.Synchronized)]
set
{
eventHandlerSet[eventKey]=value;
}
}
[MethodImpl(MethodImplOptions.Synchronized)]
public override void AddHandler(Object eventKey,Delegate handler)
{
eventHandlerSet.AddHandler(eventKey,handler);
}
[MethodImpl(MethodImplOptions.Synchronized)]
public override void RemoveHandler(Object eventKey,Delegate handler)
{
eventHandlerSet.RemoveHandler(eventKey,handler);
}
[MethodImpl(MethodImplOptions.Synchronized)]
public override void Fire(Object eventKey,Object sender,EventArgs e)
{
eventHandlerSet.Fire(eventKey,sender,e);
}
}
}
}
2.主程序
using System;
using System.Collections;
namespace Movecont
{
/// <summary>
/// 事件。
/// </summary>
class Class1
{
/// <summary>
/// 應用程序的主入口點。
/// </summary>
[STAThread]
static void Main(string[] args)
{
TypeWithLotsOfEvents mymail=new TypeWithLotsOfEvents();
Pager mypager=new Pager(mymail);
mymail.SimulateBar();
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -