第一种:通过线程返回值的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("子线程结束"); } }