public delegate void Del1(); public delegate void Del2(string name); public delegate string Del3(string name,int age); public delegate int DelSum(int from,int to); class Program { static void Main(string[] args) { #region 无参数,没有返回值的异步调用. //Del1 de1 = new Del1(T1); ////de1.Invoke();//异步调用方法. //de1.BeginInvoke(null, null); //Console.WriteLine("我是一句话而已"); //Console.ReadKey(); #endregion #region 有参数没有返回值的异步调用 //Del2 de2 = new Del2(T2); //IAsyncResult res= de2.BeginInvoke("而希克", null, null); //Console.WriteLine("异步调用我在后面"); //de2.EndInvoke(res); //Console.WriteLine("我执行在异步调用之后"); //Console.ReadKey(); #endregion #region 我是一个有参数并且有返回值的异步调用 #region 第一个有参数也有返回值的异步调用 //Del3 de3 = new Del3(T3); //IAsyncResult res = de3.BeginInvoke("福马", 19, new AsyncCallback(ar => //{ // Console.WriteLine("已经开始调用了么"); // string result = ar.IsCompleted.ToString(); // //string result2 = ar.AsyncState.ToString(); // //Console.WriteLine("IsCompleted==" + result + "," + "AsyncState==" + result2); //}), null); //string lastResult = de3.EndInvoke(res);//异步调用的T3方法的返回值 //Console.WriteLine(lastResult); //Console.WriteLine("我是异步完菜执行的方法"); //Console.ReadKey(); #endregion #endregion #region 第二种不用lambda表达式的异步调用 DelSum sum = new DelSum(Sum); //开始异步调用. IAsyncResult result= sum.BeginInvoke(1, 10,AsyCallback, "callBack需要的参数"); //int intSum = sum.EndInvoke(result);//当在这边获取它返回值的时候会阻塞主线程导致后面的代码要等主线程执行后再执行. Console.ReadKey(); #endregion } static void AsyCallback(IAsyncResult ias) { //当需要在这里获取异步调用的方法的返回值的时候要做到以下两步 //1.将接口强转成AsyncResult的对象. AsyncResult result = ias as AsyncResult; //在调用函数中的最后一个参数的获得方法result.AsyncState Console.WriteLine( result.AsyncState.ToString()); //2.再将AsyncResult对象中的委托的对象属性转成DelSum对象,就是相当于sum委托对象 DelSum sum1 = result.AsyncDelegate as DelSum; //获取方法中的返回值. int sum= sum1.EndInvoke(ias); Console.WriteLine(sum); } static int Sum(int from, int to) { int sum = 0; for (int i = from; i <=to; i++) { sum += i; Thread.Sleep(500); } return sum; } static string T3(string name, int age) { Console.WriteLine("我是一个有参数,有返回值的方法"); Thread.Sleep(1000); Console.WriteLine("我是延迟1秒打印的内容"); return string.Format("我的名字叫{0},我今年{1}岁了,你们好呀!", name, age); } static void T2(string name) { Console.WriteLine("我是一个有参数没有返回值的方法"); Thread.Sleep(1000); Console.WriteLine("我的名字是" + name); } static void T1() { Console.WriteLine("没有参数"); Thread.Sleep(1000); Console.WriteLine("也米有返回值哦"); } }
13=>异步调用委托====主要用于某线程会阻塞主线程的时候使用
原文:http://www.cnblogs.com/clcloveHuahua/p/5223907.html