抽象出一个炒菜的类。
1: //炒菜
2: public class Cooking
3: {4: public string Cook(string food1, string food2)
5: {6: Thread.CurrentThread.Name = "王大厨";
7: Console.WriteLine("厨师开始炒菜");
8: 9: for (int i = 1; i <= 2; i++)
10: { 11: Thread.Sleep(TimeSpan.FromSeconds(i));12: Console.WriteLine("{0}:在炒菜(时间:{1}秒)",Thread.CurrentThread.Name,i);
13: }14: Console.WriteLine("好了,菜做完了");
15: return food1 + food2;
16: } 17: }
客户端调用该类和方法,只有等炒菜线程执行完才能执行后面。
1: class Program
2: {3: static void Main(string[] args)
4: {5: Console.WriteLine("客人点菜了!");
6: 7: Cooking cooking = new Cooking();
8: string result = cooking.Cook("鱼香", "肉丝");
9: Console.WriteLine("{0}好了,请慢用。", result);
10: 11: Console.WriteLine("客人吃饭");
12: Console.ReadKey(); 13: } 14: }
我们想让客人在炒菜上来之前喝点水,嗑点瓜子......
那就把炒菜的事交给委托,客人就可以放心地做其它事了。
使用委托异步调用注册方法
1: using System.Threading;
2: using System.Threading.Tasks;
3: 4: namespace ConsoleApplication17
5: {6: class Program
7: {8: static void Main(string[] args)
9: {10: Console.WriteLine("客人点菜了!");
11: 12: Cooking cooking = new Cooking();
13: CookDelegate del = new CookDelegate(cooking.Cook); //给委托注册方法
14: IAsyncResult asyncResult = del.BeginInvoke("西红柿", "鸡蛋", null, null);
15: Console.WriteLine("客人做点其它事......");
16: string result = del.EndInvoke(asyncResult);
17: Console.WriteLine("{0}好了,请慢用。", result);
18: Console.ReadKey(); 19: } 20: } 21: 22: public delegate string CookDelegate(string food1, string food2);
23: 24: //炒菜
25: public class Cooking
26: {27: public string Cook(string food1, string food2)
28: {29: Thread.CurrentThread.Name = "王大厨";
30: Console.WriteLine("厨师开始炒菜");
31: 32: for (int i = 1; i <= 2; i++)
33: { 34: Thread.Sleep(TimeSpan.FromSeconds(i));35: Console.WriteLine("{0}:在炒菜(时间:{1}秒)",Thread.CurrentThread.Name,i);
36: }37: Console.WriteLine("好了,菜做完了");
38: return food1 + food2;
39: } 40: } 41: } 42:
委托异步调用注册方法结束后调用回调方法
1: using System.Runtime.Remoting.Messaging;
2: using System.Text;
3: using System.Threading;
4: using System.Threading.Tasks;
5: 6: namespace ConsoleApplication17
7: {8: class Program
9: {10: static void Main(string[] args)
11: {12: Console.WriteLine("客人点菜了!");
13: 14: Cooking cooking = new Cooking();
15: CookDelegate del = new CookDelegate(cooking.Cook); //给委托注册方法
16: 17: string data = "希望您能喜欢";
18: AsyncCallback callBack = new AsyncCallback(OnCookComplete);
19: IAsyncResult asyncResult = del.BeginInvoke("西红柿", "鸡蛋", callBack, data);
20: Console.WriteLine("客人做点其它事......");
21: 22: Console.ReadKey(); 23: } 24: 25: //回调需要执行的方法
26: static void OnCookComplete(IAsyncResult asyncResult)
27: { 28: AsyncResult result = (AsyncResult) asyncResult; 29: 30: //从异步结果中可以拿到委托
31: CookDelegate del = (CookDelegate)result.AsyncDelegate; 32: 33: //从异步结果中可以拿到BeginInvoke方法中的object参数
34: string data = (string) asyncResult.AsyncState;
35: 36: string r = del.EndInvoke(asyncResult);
37: Console.WriteLine("{0}好了,请慢用,{1}", r,data);
38: } 39: } 40: 41: public delegate string CookDelegate(string food1, string food2);
42: 43: //炒菜
44: public class Cooking
45: {46: public string Cook(string food1, string food2)
47: {48: Thread.CurrentThread.Name = "王大厨";
49: Console.WriteLine("厨师开始炒菜");
50: 51: for (int i = 1; i <= 2; i++)
52: { 53: Thread.Sleep(TimeSpan.FromSeconds(i));54: Console.WriteLine("{0}:在炒菜(时间:{1}秒)",Thread.CurrentThread.Name,i);
55: }56: Console.WriteLine("好了,菜做完了");
57: return food1 + food2;
58: } 59: } 60: } 61:
可见:
● 当使用委托异步调用注册的方法时,不会影响到客户端,客户端程序不会等
● 当异步调用委托注册的方法时,参数不仅有方法参数,还有AsyncCallback回调参数,和object对象
●
回调方法中,可以从IAsyncResult获取方法返回值,object对象
原文:http://www.cnblogs.com/darrenji/p/3622210.html