3.C#多线程补充(委托Delegate)

/*
     * 1.委托创建线程步骤
     *  1.创建一个委托对象,绑定函数
     *  2.调用委托对象的BeginInvoke(null,null)函数,有参数的话放到两个null前面
     *  3.委托对象调用BeginInvoke(null,null)返回值是一个IAsyncResult类型 用开记录线程的状态
     *  4.IAsyncResult IsCompleted函数用来判断指向的线程是否已经结束
     *  5.委托对象的 EndInvoke(IAsyncResult) 用来结束线程,获得线程的返回值 参数为指向该线程的状态类型
     */
    class Program
    {
        static int Test(int i)
        {
            Console.WriteLine("Test");
            Thread.Sleep(100); //休眠
            return 100;
        }
        static void Main(string[] args) //
        {
            
            //1.通过委托开启线程
            Func<int,int> a = Test;//创建委托
            IAsyncResult ar = a.BeginInvoke(100,null, null);//开启一个新的线程去执行,a所引用的方法 在两个Null前加上参数
            //IAsyncResult 取得当前线程的状态

            Console.WriteLine("Main");

//1.检测线程是否执行结束,并获得返回值,

//第一种方法

            while (ar.IsCompleted == false) //如果当前线没有实行完毕
            {
                Console.WriteLine(".");
                
            }
            int res = a.EndInvoke(ar); //取得异步线程的返回值
            Console.WriteLine(res);

            Console.ReadKey();

//第二种

Func<int, int> a = Test;
            //倒数第二个参数是一个委托类型的参数,当线程结束的时候会调用这个委托指向的方法
            //倒数第一个参数是给回调函数传递参数
           //C# 的lambda (参数序列) =>{ } 参数个数为1的话 不用加括号也可以
            a.BeginInvoke(100, ar => {
                int res = a.EndInvoke(ar);
                Console.WriteLine(res + "在Lambda表达式中获得函数返回值");
            }, null);

//第三种

             //1000毫秒表示超时时间,如果1000没有结束,就返回false,如果结束返回True
            bool isEnd = ar.AsyncWaitHandle.WaitOne(1000);
            int res = a.EndInvoke(ar);

        }
    }
发布了9 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_20770509/article/details/50929774
今日推荐