C#--委托开启线程

以下是学习笔记

1,要执行的方法

        static int  Test(int i,string str)//定义一个函数,返回值int类型
        {
            Console.WriteLine("test"+ "-" + i +"-"+str+"-线程ID:"+ Thread.CurrentThread.ManagedThreadId.ToString());
            Thread.Sleep(100);//让当前线程休眠,暂停当前的线程,单位ms
            return 100;
        }

  

2,【测试1】检测线程的结束,线程结束了才能取得返回值

        static void Test1()
        {
            //1,通过委托,开启一个线程
            Func<int, string, int> a = Test;
            IAsyncResult ar = a.BeginInvoke(1, "siki", null, null);//开启一个新的线程去执行a所引用的方法
            //1 和"siki",是传参数
            //IAsyncResult获取当前线程的状态
            //可以认为线程是同时执行的(异步执行)

            #region 【测试1】检测线程的结束,线程结束了才能取得返回值

            while (ar.IsCompleted == false)//如果当前线程没有执行完毕
            {
                Console.WriteLine($"等待开启的线程执行完成,线程ID:{Thread.CurrentThread.ManagedThreadId.ToString()}");
                Thread.Sleep(10);//控制子线程的检测频率
            }

            int res = a.EndInvoke(ar);//获取线程的返回值
            Console.WriteLine($"开启的线程执行完成,线程ID:{Thread.CurrentThread.ManagedThreadId.ToString()},得到返回值:{res}");

            #endregion
        }

  

Main方法运行:

            Console.WriteLine($"主线程开始:线程ID:{Thread.CurrentThread.ManagedThreadId.ToString()}");
            Test1();

 

运行结果:

主线程开始:线程ID:1
等待开启的线程执行完成,线程ID:1
test-1-siki-线程ID:3
等待开启的线程执行完成,线程ID:1
等待开启的线程执行完成,线程ID:1
等待开启的线程执行完成,线程ID:1
等待开启的线程执行完成,线程ID:1
等待开启的线程执行完成,线程ID:1
等待开启的线程执行完成,线程ID:1
等待开启的线程执行完成,线程ID:1
等待开启的线程执行完成,线程ID:1
等待开启的线程执行完成,线程ID:1
开启的线程执行完成,线程ID:1,得到返回值:100

  

3,【测试2】,通过等待句柄,检测线程结束

        static void Test2()
        {
            //1,通过委托,开启一个线程
            Func<int, string, int> a = Test;
            IAsyncResult ar = a.BeginInvoke(1, "siki", null, null);//开启一个新的线程去执行a所引用的方法
            //1 和"siki",是传参数
            //IAsyncResult获取当前线程的状态
            //可以认为线程是同时执行的(异步执行)

            //【测试2】,通过等待句柄,检测线程结束 
            bool isEnd = ar.AsyncWaitHandle.WaitOne(90);//1000ms表示超时时间,如果等待了1000ms,线程还没结束,这个方法返回false
            if (isEnd)
            {
                int res = a.EndInvoke(ar);//获取线程的返回值 
                Console.WriteLine($"结束了,得到了返回值是:{res},线程ID:{Thread.CurrentThread.ManagedThreadId.ToString()}");
            }
            else
            {
                Console.WriteLine($"没结束,等待继续执行,线程ID:{Thread.CurrentThread.ManagedThreadId.ToString()}");
                int res = a.EndInvoke(ar);//获取线程的返回值
                Console.WriteLine($"结束了,得到了返回值是:{res},线程ID:{Thread.CurrentThread.ManagedThreadId.ToString()}");
            }
        }

  

Main方法运行:

            Console.WriteLine($"主线程开始:线程ID:{Thread.CurrentThread.ManagedThreadId.ToString()}");
            //Test1();
            Test2();

  

运行结果:

主线程开始:线程ID:1
test-1-siki-线程ID:3
没结束,等待继续执行,线程ID:1
结束了,得到了返回值是:100,线程ID:1

  

4,【测试3】通过回调,检测委托的线程结束

        static void Test3()
        {
            //【测试3】通过回调,检测委托的线程结束
            Func<int, string, int> a3 = Test;
            IAsyncResult ar3 = a3.BeginInvoke(1, "siki", OnCallBack, a3);//倒数第二个参数是一个委托类型的参数,表示回调函数,就是当线程结束的时候会调用这个委托指向的方法
            //倒数第一个参数用来给回调函数传递参数

            //【测试3】改成lambda表达式
            //Func<int, string, int> a = Test;
            //a.BeginInvoke(1, "siki", ar =>
            //{
            //    int res = a.EndInvoke(ar);
            //    Console.WriteLine("在lmabda中得到了返回值是:" + res);

            //}, null);
        }

  

回调方法:

        static void OnCallBack(IAsyncResult ar)
        {
            Func<int, string, int> a3 = ar.AsyncState as Func<int, string, int>;
            //ar.AsyncState就是传递过来的数据
            //ar.AsyncState是这个 Func<int, string, int>类型的
            //把ar.AsyncState转成这个类型的 Func<int, string, int>的对象

            int res = a3.EndInvoke(ar);//获取线程的返回值 
            Console.WriteLine("在回调函数中得到了返回值是:" + res);
        }

  

Main方法运行:

        static void Main(string[] args)
        {
            Console.WriteLine($"主线程开始:线程ID:{Thread.CurrentThread.ManagedThreadId.ToString()}");
            //Test1();
            //Test2();
            Test3();

            Console.ReadKey();
        }

  

测试结果:

主线程开始:线程ID:1
test-1-siki-线程ID:3
在回调函数中得到了返回值是:100

  

 

原文地址:https://www.cnblogs.com/baozi789654/p/15266148.html