1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace CallBackTest 11 { 12 public partial class Form1 : Form 13 { 14 public Form1() 15 { 16 InitializeComponent(); 17 } 18 19 //要进行异步的方法 20 private string MethodName(int num, out int ret) 21 { 22 ret = num; 23 return "HelloWorld"; 24 } 25 26 //定义与方法同签名的委托 27 private delegate string DelegateName(int num, out int ret); 28 29 //回调方法(异步完成时,执行的方法,此方法只有IAsyncResult一个参数,但是该参数几乎万能,可以传递Object) 30 private void CallBackMethod(IAsyncResult ar) 31 { 32 DelegateName dn = (DelegateName)ar.AsyncState; 33 34 int i; 35 36 string r = dn.EndInvoke(out i, ar);//一定要EndInvoke,否则你的下场很惨 37 MessageBox.Show("异步完成了!i的值是"+i.ToString()+",r的值是"+r); 38 } 39 40 private void Form1_Load(object sender, EventArgs e) 41 { 42 //实例化委托并初赋值 43 DelegateName dn = new DelegateName(MethodName); 44 int i; 45 //实例化回调函数,把AsyncCallback看成是Delegate就懂了,实际上AsyncCallback是一种特殊的Delegate 46 AsyncCallback acb = new AsyncCallback(CallBackMethod); 47 //异步开始 48 //如果参数acb换成null则表示没有回调方法 49 //最后一个参数dn的地方,可以换成任意对象,该对象可以被回调方法从参数中获取出来,写成null也可以。 50 //参数dn相当于该线程的ID,如果有多个异步线程,可以都是null,但是绝对不能一样,不能是同一个object,否则异常 51 IAsyncResult iar = dn.BeginInvoke(1, out i, acb, dn); 52 } 53 } 54 }
运行结果如下: