zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 767 bytes');
    mysql的utf8与utf8mb4 异同;utf8mb4_unicode_ci 与 utf8mb4_general_ci 如何选择
    /etc/skel 目录作用
    react组件引用时的default常见错误
    Java效率工具之Lombok
    Java问题定位之如何借助线程堆栈进行问题分析
    Java线程堆栈分析
    Java问题定位之Java线程堆栈分析
    Java项目性能瓶颈分析及定位(八)——Java线程堆栈分析(五)
    SpringMVC的各种参数绑定方式
  • 原文地址:https://www.cnblogs.com/wxhao/p/13592311.html
Copyright © 2011-2022 走看看