回调函数的基本用法。

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