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
  • 相关阅读:
    Python time ctime()方法
    Python time clock()方法
    Python time asctime()方法
    Python time altzone()方法
    Python 日期和时间
    java——字符串常量池、字符串函数以及static关键字的使用、数组的一些操作函数、math函数
    java——API
    java——类、对象、private、this关键字
    Java——方法及构造方法、intellij IDEA中的一些快捷键
    IntelliJ IDEA 运行java程序时出现“程序发生找不到或无法加载主类 cn.test1.test1”错误
  • 原文地址:https://www.cnblogs.com/wxhao/p/13592311.html
Copyright © 2011-2022 走看看