在輪詢模式中,原始線程發起了異步方法的調用,做一些其他處理,然后使用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(); }