异步委托
无回调函数的异步委托:
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 Program 11 { 12 static void Main(string[] args) 13 { 14 Func<int, int, string> delFunc = (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 Program 12 { 13 static void Main(string[] args) 14 { 15 Func<int, int, string> delFunc = (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<int, int, string>)result.AsyncDelegate; //拿到委托的实例:delFunc 36 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 Program 12 { 13 static void Main(string[] args) 14 { 15 Func<int, int, string> delFunc = (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<int, int, string>)ar.AsyncState; 26 string returnValue = del.EndInvoke(ar); 27 Console.WriteLine("返回值:" + returnValue); 28 Console.WriteLine("传给异步回调函数的参数:" + ar.AsyncState); 29 } 30 } 31 }