- namespace Test
- {
- class WT
- {
- //定义一个委托
- public delegate void EventHandler(string a);
- //为委托定义一个事件
- public static event EventHandler SendMessage;
- static void Main(string[] args)
- {
- //注册(绑定)
- WT.SendMessage+= Send;
- //触发
- SendMessage("触发");
- }
- public static void Send(string s)
- {
- Console.WriteLine(s);
- }
- }
- }
- 上例中,一旦SendMessage就会打印内容,但是通过这个例子可能会让人觉得脱裤子放屁,委托的意义何在?直接调用函数不是更简单?那下面这个例子可以说明一些问题
- //定义委托类型
- public delegate void DelegateGotBarcode(string barcode);
- //定义委托类型的变量
- public event DelegateGotBarcode GotBarcode;
- /// <summary>
/// 通讯返回接收函数,这里采用串口通讯返回函数,一旦接收到串口数据调用委托函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void Com_DataReceive(object sender, SerialDataReceivedEventArgs e)
{
try
{
Thread.Sleep(100);
if (com.BytesToRead > 0)
{
barcode = com.ReadLine();
Dal.Log.writeLog("【读取到条码号】"+barcode, 0);
com.DiscardInBuffer();
if(GotBarcode!=null)
{
GotBarcode(barcode);
}
}
}
catch (System.Exception ex)
{
Dal.Log.writeLog(ex.Message, 1);
}
}
在前台界面中代码如下
//绑定委托函数
bs.GotBarcode += new DelegateGotBarcode(bs_GotBarcode);
//定义函数内容,在前台界面显示收到的条码
public void bs_GotBarcode(string strCode)
{
this.txtMedSearch.Invoke(new EventHandler(delegate
{
txtMedSearch.Text = strCode;
}));
}
这样后台串口一旦收到串口数据,前台界面就会直接显示条码内容,如果不采用委托来实现这个功能就有点不方便。