多线程和异步编程的那些事 (二)

回调函数:

1.通过委托异步调用方法

2.委托类型的Begininvoke(<输入和输出变量>,AsyncCallBack CallBack,Object asyncState)方法

3.返回值:IAsyncResult-->异步操作状态接口,封装了异步执行中的参数。

4.委托类型的EndInvoke()方法:借助于IAsyncResult接口对象,不断查询异步调用是否结束。该方法之道被异步调用的方法所有参数,异步调用完毕后,取出异步调用结果作为返回值。

5.

//3.获取异步执行结果
            int r = objMyCal.EndInvoke(result);
            this.lblInfo1.Text = r.ToString();

 int r = objMyCal.EndInvoke(result);这一段会不断询问结果,结果出来之前不会执行下一段代码;

******************************************例程***************************************************************

  //同步执行
        private void btnTest1_Click(object sender, EventArgs e)
        {
            this.lblInfo1.Text = ExecuteTask1(10).ToString();
            this.lblInfo2.Text = ExecuteTask2(20).ToString();
        }

        //异步执行
        private void btnTest2_Click(object sender, EventArgs e)
        {
            //定义委托变量
            MyCalculator objMyCal = ExecuteTask1;

            //1.异步调用任务
            IAsyncResult result = objMyCal.BeginInvoke(10,null,null);
            this.lblInfo1.Text = "正在计算请稍等......";
            //2.可以并行执行其他任务
            this.lblInfo2.Text = ExecuteTask2(20).ToString();
            //3.获取异步执行结果
            int r = objMyCal.EndInvoke(result);
            this.lblInfo1.Text = r.ToString();
        }

        //根据委托定义方法
        private int ExecuteTask1(int num)
        {
            Thread.Sleep(5000);
            return num * num;
        }
        private int ExecuteTask2(int num)
        {
            Thread.Sleep(8000);
            return num * num;
        }
    }
    //定义委托
    public delegate int MyCalculator(int num);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值