无回调函数的异步委托:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Threading; 7 8 namespace 异步委托 9 {10 class Program11 {12 static void Main(string[] args)13 {14 FuncdelFunc = (a, b) => 15 { 16 return (a + b).ToString();17 };18 //异步调用委托19 IAsyncResult result = delFunc.BeginInvoke(3, 4, null, null); //内部原理:使用了一个线程池的线程去执行了委托执向的方法20 //获取异步委托的结果21 if (result.IsCompleted) //判断异步委托是否执行完成,返回布尔值22 {23 string str = delFunc.EndInvoke(result); //EndInvoke方法会阻塞当前的线程,直到异步委托执行完成之后,才能继续往下执行24 Console.WriteLine(str);25 }26 Console.ReadKey();27 }28 }29 }
有回调函数的异步委托:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Threading; 7 using System.Runtime.Remoting.Messaging; 8 9 namespace 异步委托10 {11 class Program12 {13 static void Main(string[] args)14 {15 FuncdelFunc = (a, b) => 16 { 17 return (a + b).ToString();18 };19 ////异步调用委托20 //IAsyncResult result = delFunc.BeginInvoke(3, 4, null, null); //内部原理:使用了一个线程池的线程去执行了委托执向的方法21 ////获取异步委托的结果22 //if (result.IsCompleted) //判断异步委托是否执行完成,返回布尔值23 //{24 // string str = delFunc.EndInvoke(result); //EndInvoke方法会阻塞当前的线程,直到异步委托执行完成之后,才能继续往下执行25 // Console.WriteLine(str);26 //}27 delFunc.BeginInvoke(3, 4, MyAsyncCallback, "123");28 Console.ReadKey();29 }30 //回调函数:是异步委托方法执行完成之后,再来调,回调函数31 public static void MyAsyncCallback(IAsyncResult ar)32 {33 //1、拿异步委托执行的结果34 AsyncResult result = (AsyncResult)ar;35 var del =(Func )result.AsyncDelegate; //拿到委托的实例:delFunc36 string returnValue = del.EndInvoke(result);37 Console.WriteLine("返回值:"+returnValue);38 //2、拿到给回调函数的参数39 Console.WriteLine("传给异步回调函数的参数:"+result.AsyncState); 40 }41 }42 }
效果
有回调函数更优方法:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Threading; 7 using System.Runtime.Remoting.Messaging; 8 9 namespace 异步委托10 {11 class Program12 {13 static void Main(string[] args)14 {15 FuncdelFunc = (a, b) => 16 { 17 return (a + b).ToString();18 };19 delFunc.BeginInvoke(3, 4, MyAsyncCallback, delFunc);20 Console.ReadKey();21 }22 //回调函数:是异步委托方法执行完成之后,再来调,回调函数23 public static void MyAsyncCallback(IAsyncResult ar)24 {25 var del= (Func )ar.AsyncState;26 string returnValue = del.EndInvoke(ar);27 Console.WriteLine("返回值:" + returnValue);28 Console.WriteLine("传给异步回调函数的参数:" + ar.AsyncState);29 }30 }31 }