C#中的異步多線程12 輪詢


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM