C# 委托与事件的简单应用
看过最好的文章,是这篇C# 中的委托和事件 - Jimmy Zhang - 博客园 (cnblogs.com)
看过以后,需要自己总结使用,毕竟光说不练假把戏,记录一下
1. 把委托当做参数传递使用
对于具有相同参数类型,相同返回类型的方法,可以通过同一个带有委托的方法直接调用,避免用ifelse或者switch选择
public delegate int ComputeEventHandle(int x, int j); //声明委托 private int Add(int a,int b) { return a + b; } private int Mul(int a,int b) { return a * b; } private int Sub(int a,int b) { return a - b; } private int Div(int a,int b) { if (b != 0) { return a / b; } else { return int.MinValue; } } private int GetResult(int a ,int b, ComputeEventHandle handle ) //传递委托 { return handle(a,b); } private void button11_Click(object sender, EventArgs e) { int re = GetResult(10, 2, Add); Console.WriteLine(re); re = GetResult(10, 2, Sub); Console.WriteLine(re); re = GetResult(10, 2, Mul); Console.WriteLine(re); re = GetResult(10, 2, Div); Console.WriteLine(re); }
2. 通过委托异步调用
异步委托调用前面线程总结的文章已经写过,这里写个简单的
public delegate void WaitingEventHandle(int time); private void Waiting(int time) { Console.WriteLine("开始"); Thread.Sleep(time * 1000); Console.WriteLine("结束"); } private void button12_Click(object sender, EventArgs e) { WaitingEventHandle waitingHandle = new WaitingEventHandle(Waiting); waitingHandle.BeginInvoke(3, null, null); }
3. 通过委托解决跨线程更改控件属性问题
private delegate void SetTextEventHandle(Control lb, string strValue); private void SetCaptionValue(Control cl, string text) { try { if (cl.InvokeRequired)//如果调用控件的线程和创建创建控件的线程不是同一个则为True { while (!cl.IsHandleCreated) { //解决窗体关闭时出现“访问已释放句柄“的异常 if (cl.Disposing || cl.IsDisposed) return; } SetTextEventHandle d = new SetTextEventHandle(SetCaptionValue); cl.BeginInvoke(d, new object[] { cl, text }); } else { cl.Text = text; } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
4. 事件的使用
在一个界面中通过事件调用另一个界面的方法
//Form1中 public event Func<int> FlashWork; private async void bt_Flash_Click(object sender, EventArgs e) { var task = Task.Run(() => { return FlashWork(); }); int re = await task; if (re == 1) { MessageBox.Show("刷写异常,请重新刷写"); } } //Form2中 form.FlashWork += Flash;//订阅事件,Flash是一个方法

浙公网安备 33010602011771号