美文网首页
C# 之委托开启线程

C# 之委托开启线程

作者: 菜鸟程序猿 | 来源:发表于2017-08-11 11:05 被阅读0次
    namespace 开启线程
    {
        class Program
        {
            static void Main(string[] args)
            {
                Func<int, int> func = Test;
    -------------------------------------------------------------------------------------------------
               //倒数第二个参数是回调函数,倒数第一个参数是给回调函数传递的数据
               IAsyncResult ar=  func.BeginInvoke(100, null, null);//开启子线程
                while (ar.IsCompleted==false)//会卡住当前线程,直到子线程执行完毕
                {
                 Console.WriteLine("等待ing");
                }
               int res = func.EndInvoke(ar); //获取func委托的返回值(即Test()的返回值)
               Console.WriteLine(res+"结束子线程");
    ---------------------------------------------------------------------------------------------------
              //参数1是Test需要的参数,参数2是回调参数,参数三是委托对象
              IAsyncResult ar=  func.BeginInvoke(100, OnCallBack, func);//开启子线程
    ---------------------------------------------------------------------------------------------------
            //把回调函数用lambda表达式表示,因为lambda表达式可以访问外部的变量,所以不需要给回调函数传递参数
            func.BeginInvoke(100, ar =>
                {
                    int res = func.EndInvoke(ar);
                    Console.WriteLine(res + "结束子线程");
                }, null);
            }
    -------------------------------------------------------------------------------------------------------------
            static int Test(int num)  //普通函数
            {
                Console.WriteLine("Test");
                return num;
            }    
      
            static void OnCallBack(IAsyncResult ar) //回调函数
            {
              //ar.AsyncState该方法可以取到给回调函数传递的参数(这里取到的是Mian 方法中的func然后赋值给同类型的变量)
                Func<int, int> func = ar.AsyncState as Func<int, int>; 
                int res = func.EndInvoke(ar);
                Console.WriteLine(res + "结束子线程");
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:C# 之委托开启线程

          本文链接:https://www.haomeiwen.com/subject/jlrlrxtx.html