经过定义委托,来实现同步和异步,委托经过Action和Func来实现,记录学习委托的同步和异步的过程dom
委托的同步方法异步
委托的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来实现。spa
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(); }
异步回调线程
用回调函数,当调用结束时会自动调用回调函数,解决了为等待调用结果,而让线程依旧被阻塞的局面。code
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(); }