在轮询模式中,原始线程发起了异步方法的调用,做一些其他处理,然后使用IAsyncResult对象的IsComplete属性来定期检查开启的线程是否完成。如果异步方法已经完成,原始线程就调用EndInvoke并继续。否则,做一些其他处理,然后过一会儿再检查。
BeginInvoke返回一个IAsyncResult接口的引用(其内部是AsyncResult类的对象),AsyncResult类表现了异步方法的状态,其特性包括:
1、当调用委托对象的BeginInvoke方法时,系统创建了一个AsyncResult对象,但它不返回对象的引用,而是返回对象中包含的IAsyncResult接口的引用。
2、AsyncResult对象包含一个叫做AsyncDelegate的属性,它返回一个指向被调用来开启异步方法的委托的引用。但是,这个属性是类对象的一部分而不是接口的一部分。
3、IsCompleted属性返回一个bool值,标识异步方法是否完成。
4、AsyncState属性返回一个对象的引用,作为BeginInvoke方法调用时的state参数。它返回object类型的引用。
示例:
delegate long Mydel(int first, int seconde); static long Sum(int x,int y) { Console.WriteLine("Inside Sum"); Thread.Sleep(100); return x + y; } static void Main(string[] args) { Mydel del = new Mydel(Sum); //发起并调用异步方法 IAsyncResult iar = del.BeginInvoke(3, 5, null, null); Console.WriteLine("After BeginInvoke"); //检查异步方法是否完成 while(!iar.IsCompleted) { Console.WriteLine("Not Done"); //继续处理 for (long i = 0; i < 1000000; i++) ; } Console.WriteLine("Done"); //调用EndInvoke来获取接口并进行清理 long result = del.EndInvoke(iar); Console.WriteLine("Result:{0}", result); Console.ReadLine(); }