回调函数的基本用法。
using System; using System.Threading; namespace AsyncBasic { class Program { [STAThread] static void Main(string[] args) { new Program().ExcuteCal(); Console.ReadKey(); } private Func<int, int, int> Cal = null; // [1] 声明委托变量。 都要用声明为成员变量 public Program() { Cal = new Func<int, int, int>(ExcuteTask1); // 初始化委托。 } // [4] 同时执行多个任务 public void ExcuteCal() { for (int i = 1; i <= 10; i++) { Cal.BeginInvoke(i * 10, i * 100, MyCallBack, i); //最后一个参数 i 给回调函数的字段AsyncState赋值,如果数据很多可以定义成类或结构 } } private int ExcuteTask1(int num, int ms) // [2] 根据委托实现方法。 { Thread.Sleep(ms); return num * num; } //[5] 回调函数 private void MyCallBack(IAsyncResult result) { int res = Cal.EndInvoke(result); Console.WriteLine("第{0}个计算结果是{1}", result.AsyncState.ToString(), res); } } }
程序有些地方可以用 lamdba 表达式简化下。
输出:
第1个计算结果是100 第2个计算结果是400 第3个计算结果是900 第4个计算结果是1600 第5个计算结果是2500 第6个计算结果是3600 第7个计算结果是4900 第8个计算结果是6400 第9个计算结果是8100 第10个计算结果是10000