• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#检测线程结束的3种方式

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

第一种:通过线程返回值的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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
c#引用错误发布时间:2022-07-14
下一篇:
VisionPro各控件的C#中类库(CogToolBlock类)像函数设计一样。发布时间:2022-07-14
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap