using System; using System.Collections.Generic; using System.Text;namespace UseMultiDelegateExample { public delegate void MyMultiDelegate(int value ); //事件发布者类 public class Publisher { public MyMultiDelegate handlers; //事件响应者清单 } //事件响应者类 public class Subscriber { //事件处理函数 public void MyMethod(int i ) { Console.WriteLine(i); } } class Program { static void Main(string[] args) { //一个事件源对象 Publisher p = new Publisher(); //两个事件响应者 Subscriber s1 = new Subscriber(); Subscriber s2 = new Subscriber(); //可以直接调用Delegate类的静态方法组合多个委托 p.handlers = System.Delegate.Combine(p.handlers, new MyMultiDelegate(s1.MyMethod)) as MyMultiDelegate; p.handlers = System.Delegate.Combine(p.handlers, new MyMultiDelegate(s2.MyMethod)) as MyMultiDelegate; //或调用+=运算符组合委托 //p.handlers += new MyMultiDelegate(s1.MyMethod); //p.handlers += new MyMultiDelegate(s2.MyMethod); //最简单的写法 //p.handlers += s1.MyMethod; //p.handlers += s2.MyMethod;
{
private delegate void XmlLoad ();//这是委托
private event XmlLoad XmlLoading;//xml加载中触发的事件
private event XmlLoad XmlLoaded;//xml加载完成后触发的事件 //当运行此方法后会引发2个事件
public void LoadXml ( string path )
{
if ( XmlLoading != null )
XmlLoading.Invoke(); XmlDocument xml = new XmlDocument();
xml.Load( path ); if ( XmlLoaded != null )
XmlLoaded.Invoke();
}
}
跨窗体线程调用控件或窗体//跨线程关闭主窗口form---->this
ISynchronizeInvoke synchronizer;
synchronizer = this;
if (synchronizer.InvokeRequired)
{
MethodInvoker invoker = new
MethodInvoker(this.Close);
synchronizer.Invoke(invoker, null);
}
else
{ this.Close(); }////////////////////////////////////////////////////////////////////////////////////// #region backgroundwoeker里鼠标和按钮禁用,
/// <summary>
/// pbtnPublish.Enabled = b;//false
/// this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
/// </summary>
/// <param name="b">false</param>
public void btnPublishStatus(bool b)
{
if (b)
{
CanPublishAbort(false);
CanPublishStart(b);
CursorSet(System.Windows.Forms.Cursors.Default);
}
else
{
CanPublishAbort(true);
CanPublishStart(b);// CursorSet(System.Windows.Forms.Cursors.WaitCursor);
}
}
delegate void CanPub(bool can);
public void CanPublishStart(bool can)
{
if (pbtnPublishStart.InvokeRequired)
{
CanPub cp = new CanPub(CanPublishStart);
pbtnPublishStart.Invoke(cp, new object[] { can });
}
else { pbtnPublishStart.Enabled = can; }
}
protected void CanPublishAbort(bool can)
{
if (pbtnPublishAbort.InvokeRequired)
{
CanPub cp = new CanPub(CanPublishAbort);
pbtnPublishAbort.Invoke(cp, new object[] { can });
}
else { pbtnPublishAbort.Enabled = can; }
} delegate void SetCursor(Cursor c);
public void CursorSet(Cursor c)
{
if (this.InvokeRequired)
{
SetCursor sc = new SetCursor(CursorSet);
this.Invoke(sc, new object[] { c });
}
else
{
this.Cursor = c;
} }
#endregion
http://topic.csdn.net/u/20080626/17/1742fccb-1513-4543-9f9f-045660d24666.html
2.创建事件委托实例,如:public event NameEventHandler handler;
3.事件处理程序,如:handler+=new NameEventHandler(NameChange);
4.触发事件,调用事件委托实例,如:
if(handler!=null)
handler(this,new NameEventArgs(name,list.count));
跨窗体线程调用控件或窗体//跨线程关闭主窗口form---->this
ISynchronizeInvoke synchronizer;
synchronizer = this;
if (synchronizer.InvokeRequired)
{
MethodInvoker invoker = new
MethodInvoker(this.Close);
synchronizer.Invoke(invoker, null);
}
else
{ this.Close(); }////////////////////////////////////////////////////////////////////////////////////// #region backgroundwoeker里鼠标和按钮禁用,
/// <summary>
/// pbtnPublish.Enabled = b;//false
/// this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
/// </summary>
/// <param name="b">false</param>
public void btnPublishStatus(bool b)
{
if (b)
{
CanPublishAbort(false);
CanPublishStart(b);
CursorSet(System.Windows.Forms.Cursors.Default);
}
else
{
CanPublishAbort(true);
CanPublishStart(b);// CursorSet(System.Windows.Forms.Cursors.WaitCursor);
}
}
delegate void CanPub(bool can);
public void CanPublishStart(bool can)
{
if (pbtnPublishStart.InvokeRequired)
{
CanPub cp = new CanPub(CanPublishStart);
pbtnPublishStart.Invoke(cp, new object[] { can });
}
else { pbtnPublishStart.Enabled = can; }
}
protected void CanPublishAbort(bool can)
{
if (pbtnPublishAbort.InvokeRequired)
{
CanPub cp = new CanPub(CanPublishAbort);
pbtnPublishAbort.Invoke(cp, new object[] { can });
}
else { pbtnPublishAbort.Enabled = can; }
} delegate void SetCursor(Cursor c);
public void CursorSet(Cursor c)
{
if (this.InvokeRequired)
{
SetCursor sc = new SetCursor(CursorSet);
this.Invoke(sc, new object[] { c });
}
else
{
this.Cursor = c;
} }
#endregion
http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx
using System;
using System.Collections.Generic;
using System.Text;namespace UseMultiDelegateExample
{
public delegate void MyMultiDelegate(int value ); //事件发布者类
public class Publisher
{
public MyMultiDelegate handlers; //事件响应者清单
}
//事件响应者类
public class Subscriber
{
//事件处理函数
public void MyMethod(int i )
{
Console.WriteLine(i);
}
} class Program
{
static void Main(string[] args)
{
//一个事件源对象
Publisher p = new Publisher();
//两个事件响应者
Subscriber s1 = new Subscriber();
Subscriber s2 = new Subscriber();
//可以直接调用Delegate类的静态方法组合多个委托
p.handlers = System.Delegate.Combine(p.handlers, new MyMultiDelegate(s1.MyMethod)) as MyMultiDelegate;
p.handlers = System.Delegate.Combine(p.handlers, new MyMultiDelegate(s2.MyMethod)) as MyMultiDelegate;
//或调用+=运算符组合委托
//p.handlers += new MyMultiDelegate(s1.MyMethod);
//p.handlers += new MyMultiDelegate(s2.MyMethod);
//最简单的写法
//p.handlers += s1.MyMethod;
//p.handlers += s2.MyMethod;
//直接调用委托变量,代表激发事件
p.handlers(10); Console.ReadKey(); }
}
}