C# 之委托开启线程

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 + "结束子线程");
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容