这应该是一种传统的方式吧。
一般顺序:
using System; using System.Threading; namespace AsyncBasic { class Program { [STAThread] static void Main(string[] args) { new Program().ExcuteCal(); Console.ReadKey(); } public void ExcuteCal() { Func<int, int> Cal = ExcuteTask1; // [1] 声明委托变量。 // [3] 异步调用 IAsyncResult result = Cal.BeginInvoke(100, null, null); Console.WriteLine("正在计算…"); Console.WriteLine(ExcuteTask2(20)); int s = Cal.EndInvoke(result); //委托类型的EndInvoke()方法:借助于IAsyncResult接口对象,不断查询异步调用是否结束。 //该方法知道被异步调用的方法所有参数,所以,异步调用完毕后,取出异步调用结果作为返回值。 Console.WriteLine(s); } private int ExcuteTask1(int num) // [2] 根据委托实现方法。 { Thread.Sleep(2000); return num * num; } private int ExcuteTask2(int num) { return num * num; } } }
输出:
正在计算… 400 10000
可见,异步调用的时候可以做其他的事情。
委托类型的Begininvoke(<输入和输出变量>,AsyncCallbac callback,object asyncState)
方法:异步调用的核心
第一个参数,表示委托对应的方法实参。
第二个参数callback
,回调函数,表示异步调用结束时自动调用的函数。
第三个参数asyncState
,用于向回调函数提供相关参数信息
返回值:IAsyncResult
-->异步操作状态接口,封装了异步执行的中的参数