第一種:通過線程返回值的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(); } }
第二種:通過線程返回值的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(); } }
第三種:通過回調函數的方式
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("子線程結束"); } }