通过定义委托,来实现同步和异步,委托通过Action和Func来实现,记录学习委托的同步和异步的过程
委托的同步方法
委托的Invoke方法用来进行同步调用。
static void Main(string[] args) { //无参数方法 Action action = () => Console.WriteLine("action方法执行"); action.Invoke(); //有一个参数(多个参数基本相同) Action<string> action2 = (t) => Console.WriteLine("action方法执行,{0}", t); action2.Invoke("我在测试"); //带一个参数带返回值 Func<int, bool> func = (t) => { int i = new Random().Next(1, 10); Console.WriteLine("随机数是{0}", i); return i > t; }; bool b = func.Invoke(5); Console.WriteLine("{0}",b); Console.Read(); }
同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体验,这时候异步调用就很有必要了。
委托的异步调用
异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行。委托的异步调用通过BeginInvoke和EndInvoke来实现。
static void Main(string[] args) { //无参数方法 Action action = () => Console.WriteLine("action方法执行"); action.BeginInvoke(null,null); //有一个参数(多个参数基本相同) Action<string> action2 = (t) => Console.WriteLine("action方法执行,{0}", t); action2.BeginInvoke("我是个测试",null,null); //带一个参数带返回值 Func<int, bool> func = (t) => { int i = new Random().Next(1, 10); Console.WriteLine("随机数是{0}", i); return i > t; }; var result = func.BeginInvoke(5,null,null); bool b = func.EndInvoke(result); Console.WriteLine("{0}",b); Console.Read(); }
异步回调
用回调函数,当调用结束时会自动调用回调函数,解决了为等待调用结果,而让线程依旧被阻塞的局面。
static void Main(string[] args) { //无参数方法 Action action = () => Console.WriteLine("action方法执行"); AsyncCallback callback1 = t => { Console.WriteLine("我是回调1"); }; action.BeginInvoke(callback1, null); //有一个参数(多个参数基本相同) Action<string> action2 = (t) => Console.WriteLine("action方法执行,{0}", t); AsyncCallback callback2 = t => { Console.WriteLine("我是回调2"); }; action2.BeginInvoke("我是个测试", callback2, null); //带一个参数带返回值 Func<int, bool> func = (t) => { int i = new Random().Next(1, 10); Console.WriteLine("随机数是{0}", i); return i > t; }; AsyncCallback callback3 = t => { Console.WriteLine("我是回调3"); }; var result = func.BeginInvoke(5, callback3, null); bool b = func.EndInvoke(result); Console.WriteLine("{0}",b); Console.Read(); }