C#檢測線程結束的3種方式


第一種:通過線程返回值的IsCompleted方法。

beginInvoke方法中前面的參數為委托方法中的參數,BeginInvoke方法的返回值為IAsyncResult類型,保存了線程的狀態;

EndInvoke方法會返回線程結束后的返回值

class Program
    {
        static int Test(int i)
        {
            Console.WriteLine("test"+i);
            Thread.Sleep(10);
            return 100;
        }
        static void Main(string[] args)
        {
            Func<int,int> a = Test;
            IAsyncResult ar = a.BeginInvoke(20, null, null);
            Console.WriteLine("main");
            while (ar.IsCompleted==false)
            {
                Console.Write(".");
            }
            int res = a.EndInvoke(ar);
            Console.Write(res);
            Console.ReadKey();
        }
    }
View Code

第二種:通過線程返回值的ar.AsyncWaitHandle.WaitOne(1000)方法,方法參數為至少等待時間,如果等待1000毫秒內線程結束了,返回true;若1000毫秒后線程沒有結束,返回false。

AsyncWaitHandle.WaitOne()方法會等待當前線程結束,再執行之后的代碼

class Program
    {
        static int Test(int i)
        {
            Console.WriteLine("test"+i);
            Thread.Sleep(10);
            return 100;
        }
        static void Main(string[] args)
        {
            Func<int,int> a = Test;
            IAsyncResult ar = a.BeginInvoke(20, null, null);
            Console.WriteLine("main");
            //while (ar.IsCompleted==false)
            //{
            //    Console.Write(".");
            //}
            //int res = a.EndInvoke(ar);
            //Console.Write(res);
            bool isEnd = ar.AsyncWaitHandle.WaitOne(1000);
            if (isEnd)
            {
                int res = a.EndInvoke(ar);
                Console.Write(res);
            }
            Console.ReadKey();
        }
    }
View Code

第三種:通過回調函數的方式

BeginInvoke中倒數第二個參數是一個委托類型的參數,表示回調函數,就是當前線程結束后會調用這個委托指向的方法;

BeginInvoke中倒數第一個參數用來給回調函數傳遞參數

調用OnCallBack時,會把IAsyncResult ar傳遞到OnCallBack中。

 

class Program
    {
        static int Test(int i)
        {
            Console.WriteLine("test"+i);
            Thread.Sleep(10);
            return 100;
        }
        static void Main(string[] args)
        {
            Console.WriteLine("main");
            ////while (ar.IsCompleted==false)
            ////{
            ////    Console.Write(".");
            ////}
            ////int res = a.EndInvoke(ar);
            ////Console.Write(res);
            //bool isEnd = ar.AsyncWaitHandle.WaitOne(1000);
            //if (isEnd)
            //{
            //    int res = a.EndInvoke(ar);
            //    Console.Write(res);
            //}
            Func<int, int> a = Test;
            IAsyncResult ar = a.BeginInvoke(20, OnCallBack, a);//倒數第二個參數是一個委托類型的參數,表示回調函數,當線程結束時會調用這個委托指向的方法;倒數第一個參數用來給回調函數傳遞數據;通過ar獲取數據a
            
            Console.ReadKey();
        }

        static void OnCallBack(IAsyncResult ar)
        {
            Func<int, int> a = ar.AsyncState as Func<int, int>;
            int res = a.EndInvoke(ar);
            Console.WriteLine("在回調函數中取得結果" + res);
            Console.WriteLine("子線程結束");
        }
    }
View Code

 


免責聲明!

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



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