0 public object Invoke(Delegate method);
1 public IAsyncResult BeginInvoke(Delegate method);
在這種情況下, 如果不使用匿名方法, 則需要在代碼的上面先聲明一個(gè)delegate void DoSomething()方法, 然后可以在Invoke方法中再用lambda表達(dá)式或者委托實(shí)現(xiàn)DoSomething().
0 delegate void DoSomething();
1
2 private void App()
3 {
4 XXControl.Invoke(new DoSomething(() =>
5 {
6 //DoSomething的具體操作
7 }));
8 }
這樣做可以是可以, 但使用匿名方法則更好, 最起碼看上去更簡潔.
0 private void App()
1 {
2 XXControl.Invoke(delegate
3 {
4 //DoSomething的具體操作
5 });
6 }
上面的代碼會(huì)在編譯的時(shí)候出錯(cuò): Cannot convert anonymous method to type 'System.Delegate' because it is not a delegate type. 方法要求參數(shù)的是一個(gè)委托(delegate)類型, 而現(xiàn)在傳遞的只是一個(gè)匿名方法. 產(chǎn)生這個(gè)錯(cuò)誤最根本的原因是編譯器在處理匿名方法的時(shí)候, 沒法推斷出這個(gè)委托的方法返回的是什么類型, 也就不知道返回一個(gè)什么樣的委托.
解決方法
要解決上面這個(gè)問題, 從根本上來說就是指定這個(gè)匿名方法將會(huì)返回什么類型的委托, 有幾種方法:
1. 使用MethodInvoke或者Action
0 private void App()
1 {
2 XXControl.Invoke((MethodInvoker)delegate()
3 {
4 //DoSomething的具體操作
5 });
6 }
0 private void App()
1 {
2 XXControl.Invoke((Action)delegate()
3 {
4 //DoSomething的具體操作
5 });
6 }
MethodInvoke和Action都是方法返回類型為空的委托.
2. 可以給Control定義一個(gè)Invoke的擴(kuò)展方法
0 public static void Invoke(this Control control, Action action)
1 {
2 control.Invoke((Delegate)action);
3 }
調(diào)用的時(shí)候則可以這樣調(diào)用:
0 //使用委托
1 XXControl.Invoke(delegate { //DoSomething here});
2 //使用lambda表達(dá)式
3 XXControl.Invoke(()=>{ //DoSomething here});