zoukankan      html  css  js  c++  java
  • 异步委托

    委托实现多窗体传值

    主窗体的代码:

      public partial class FrmMain : Form
        {
            //[3] 创建委托对象(委托对象能够将委托和具体方法关联) 
            public ShowCounterDelegate msgSender;
    
    
            public FrmMain()
            {
                InitializeComponent();
                //创建从窗体对象
                FrmOther01 objFrm01 = new FrmOther01();
                FrmOther02 objFrm02 = new FrmOther02();
                FrmOther03 objFrm03 = new FrmOther03();
    
                //4.将委托变量和具体方法关联
                this.msgSender += objFrm01.Receiver;
                this.msgSender += objFrm02.Receiver;
                this.msgSender += objFrm03.Receiver;
    
                //显示三个从窗体
                objFrm01.Show();
                objFrm02.Show();
                objFrm03.Show();
            }
            private int counter = 0;
            /// <summary>
            /// 发消息
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnClick_Click(object sender, EventArgs e)
            {
                counter++;
                //msgSender(counter.ToString()); //5.调用委托变量传递信息
                msgSender.Invoke(counter.ToString());
            }
            /// <summary>
            /// 复位
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnReset_Click(object sender, EventArgs e)
            {
                counter = 0;
                msgSender("0");
            }
        }
    
        //1.声明委托
        public delegate void ShowCounterDelegate(string counter);
    

     子窗体的代码:

      //2.根据委托定义方法(接收委托传递的信息)
            public void Receiver(string counter)
            {
                this.IblCounter.Text = counter;
            }
    
     //2.根据委托定义方法(接收委托传递的信息)
            public void Receiver(string counter)
            {
                this.IblCounter.Text = counter;
            }
    
      //2.根据委托定义方法(接收委托传递的信息)
            public void Receiver(string counter)
            {
                this.IblCounter.Text = counter;
            }
    

     同步委托和异步委托

     public partial class FrmMain : Form
        {
            public FrmMain()
            {
                InitializeComponent();
            }
    
    
            private void btnExe1_Click(object sender, EventArgs e)
            {
                this.lblCount1.Text = ExectueTask1(10).ToString();
                this.lblCount2.Text = ExectueTask2(10).ToString();
            }
    
    
    
            //2.根据委托定义实现的方法
            private int ExectueTask1(int num)
            {
                System.Threading.Thread.Sleep(5000);//延迟5秒
                return num * num;
            }
    
            private int ExectueTask2(int num)
            {
                return num * num;
            }
            private void btnExe2_Click(object sender, EventArgs e)
            {
                MyCalculator objMyCal = ExectueTask1; //创建委托变量,代表方法1
    
                //通过委托异步调用方法
                //委托类型的 BeginInvoke(<输入和输出参数>,AsyncCallback callback,object asyncState)方法:异步调用的核心
                //第一个方法10,表示委托对应的实参
                //第二个参数callback:回调函数,表示异步调用后自动调用的函数
                //第三个参数asyncState,用于向回调函数提供参数信息
                //返回值 IAsyncResult-->异步操作状态接口,封住了异步执行的参数
    
    
                //异步调用任务
                IAsyncResult result = objMyCal.BeginInvoke(10,null,null);
                this.lblCount1.Text = "正在计算请稍等。。。";
    
    
                //同步执行其他任务
                this.lblCount2.Text = ExectueTask2(10).ToString();
    
                //获取异步执行的结果
                int res = objMyCal.EndInvoke(result);
                //委托类型的EndInvoke() 方法:借助于IAsyncResult接口对象,不断的查询异步调用是否结束
                //该方法知道异步调用的方法所有参数,所以,异步调用完毕后,取出异步调用的结果作为返回值
                this.lblCount1.Text = res.ToString();
            }
           
    
            //1.定义一个委托
            public delegate int MyCalculator(int num);
        }
    

     异步委托:

     public partial class FrmMain : Form
        {
            public FrmMain()
            {
                InitializeComponent();
                //初始化委托变量
                this.objMyCal = new MyCalculator(ExecuteTask);
    
                //Lambda表达式
                //this.objMyCal = (num, ms) =>
                //    {
                //        System.Threading.Thread.Sleep(ms);
                //        return num * num;
                //    };
            }
            //1.声明一个委托  延迟的秒数
            public delegate int MyCalculator(int num, int ms); //延迟的秒数
    
            //2.根据委托定义方法:返回一个数的平方
            private int ExecuteTask(int num, int ms)
            {
                System.Threading.Thread.Sleep(ms);
                return num * num;
            }
    
            //3.创建委托变量
            MyCalculator objMyCal = null;
    
    
            //同时执行多个任务
            private void btnExec_Click(object sender, EventArgs e)
            {
               
                //产生10个任务
                for (int i = 1; i < 11; i++)
                {
                    //开始异步执行,并封装异步函数
                    objMyCal.BeginInvoke(10 * i, 1000 * i, MyCallBack, i);
                    //最后一个参数i给回调函数AsyncState赋值,这个字段是object类型,如果数据很多,可以传递集合或者类和结构
                }
            }
    
            //5.编写回调函数
            private void MyCallBack(IAsyncResult result)
            {
              int res=  objMyCal.EndInvoke(result);
                
                //异步显示结果形式:第一个的计算结果:100
              Console.WriteLine("第{0}个计算结果:{1}",result.AsyncState.ToString(),res);
            }
            //异步编程总结
            //1.异步编程是建立在委托基础上的编程方法
            //2.异步调用的每个方法都是在独立的线程上执行的。因此,本质上就是一种多线程程序,也可以说是一个“简化的多线程技术”
            //3.比较适合在后台运行较为耗时间的《简单任务》,并且要求任务之间是独立的,任务中不要有直接访问可视化控件的内容。
            //4.如果后台任务要求必须按照特定顺序执行,或者访问到特定的共享资源,异步编程不太适合,而应该选择多线程开发技术   
        }
    
  • 相关阅读:
    python3.8安装flask出现错误“ModuleNotFoundError: No module named '_ctypes'”
    利用virtualenvwrapper创建虚拟环境出现错误“/usr/bin/python: No module named virtualenvwrapper”
    CentOS7 下升级Python版本
    Python 定义动态变量
    Linux常用命令
    项目经验之:项目用到LinQ (总结)
    ListBox操作一些总结
    项目经验之:如CSDN一样的分页,我能否做这样的分页吗??????
    记上一笔,listbox展示项中,隐藏其中一项
    项目经验之:SQL一些简单问题中可以使用的技巧
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/7171720.html
Copyright © 2011-2022 走看看