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

 

posted @ 2020-08-31 22:16  wxmax  阅读(5483)  评论(0编辑  收藏  举报