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號