异步调用,多线程

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace Threading
{
    public partial class FrmTest : Form
    {
        public FrmTest()
        {
            InitializeComponent();
        }
        //同步编程
        private void btnTest1_Click(object sender, EventArgs e)
        {
            this.lblInfo1.Text = ExecuteTask1(10).ToString();
            this.lblInfo2.Text = ExecuteTask1(10).ToString();
        }

        private void btnTest2_Click(object sender, EventArgs e)
        {
            MyCalculator objMyCal = ExecuteTask1;

            //异步调用
            //通过委托异步调用方法Calculator1
            //委托类型的Begininvoke(<输入和输出变量>,AsyncCallbac callback,object asyncState)方法:异步调用的核心   
            //第一个参数10,表示委托对应的方法实参。
            //第二个参数callback,回调函数,表示异步调用结束时自动调用的函数。
            //第三个参数asyncState,用于向回调函数提供相关参数信息
            //返回值:IAsyncResult -->异步操作状态接口,封装了异步执行的中的参数
            //IAsyncResult接口成员:查看帮助文档
            IAsyncResult result = objMyCal.BeginInvoke(10,null,null);
            this.lblInfo1.Text = "正在计算....";
            this.lblInfo2.Text = ExecuteTask2(200).ToString();

            int r = objMyCal.EndInvoke(result);
            //委托类型的EndInvoke()方法:借助IasynResult接口对象,不断查询异步调用是否结束
            //该方法知道异步调用的所有参数,所以,异步调用结束后,取出异步调用结果作为返回值
            this.lblInfo1.Text = r.ToString();
        }

        private int ExecuteTask1(int num)
        {
            Thread.Sleep(5000);
            return num*num;
        }
        private int ExecuteTask2(int num)
        {
            return num * num;
        }
        //1 定义一个委托

        public delegate int MyCalculator(int num);
    }
}

异步多线程的回调函数

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace _02_AsyncCallBackDemo
{
    public partial class FrmCalllBack : Form
    {
        public FrmCalllBack()
        {
            InitializeComponent();
            //3.2 初始化委托变量
            //this.objMycal += ExecuteTask1;

            //使用lambda表达式
            this.objMycal += (int num,int ms) => { Thread.Sleep(ms); return num * num; };

        }
        //3 创建委托变量,因为异步函数和回调函数都要使用,所以定义成员变量
        MyCalculator objMycal = null;
        //4 同时执行多个任务
        private void btnExec_Click(object sender, EventArgs e)
        {
            
            //MyCalculator objMycal = null;
            //objMycal += ExecuteTask1;
            //发布任务
            for (int i = 0; i < 11; i++)
            {
                objMycal.BeginInvoke(10 * i, 1000 * i, MyCallBack, i);//参数,参数, AsynCallback,object @object
            }
        }
        //5 回调函数
        private void MyCallBack(IAsyncResult result)
        {
            int res = objMycal.EndInvoke(result);
            //异步显示结果:result.AsyncState字段用来封装回调时自定义的参数,object类型
            Console.WriteLine("第{0}个计算结果为:{1}",result.AsyncState.ToString(),res);
            //最后一个参数i给回调函数字段AsynState赋值, 如果数据很多可以定义成类或者结构
        }
        //2, 根据委托定义方法
        private int ExecuteTask1(int num, int ms)
        {
            Thread.Sleep(ms);
            return num * num;
        }
        //1, 声明委托
        public delegate int MyCalculator(int num, int ms);
    }
}
//异步编程总结:
//1. 异步编程是建立在委托基础上的一种编程方法。
//2. 异步调用的每个方法都是在独立的线程中执行。因此,本质上就是一种多线程程序,也可以说是一种“简化版本”的多线程技术。
//3. 比较适合在后台运行较为耗费时间的《简单任务》,并且任务要求相互独立,任务中不应该有代码直接访问可视化控件。
//4. 如果后台任务要求必须按照特定顺序执行,或者必须访问共享资源,则异步编程不适合,而应该直接采用多线程开发技术。

通过异步编程实现多线程:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace Threading
{
    public partial class FrmTest : Form
    {
        public FrmTest()
        {
            InitializeComponent();
        }
        //同步编程
        private void btnTest1_Click(object sender, EventArgs e)
        {
            this.lblInfo1.Text = ExecuteTask1(10).ToString();
            this.lblInfo2.Text = ExecuteTask1(10).ToString();
        }

        private void btnTest2_Click(object sender, EventArgs e)
        {
            MyCalculator objMyCal = ExecuteTask1;

            //异步调用
            //通过委托异步调用方法Calculator1
            //委托类型的Begininvoke(<输入和输出变量>,AsyncCallbac callback,object asyncState)方法:异步调用的核心   
            //第一个参数10,表示委托对应的方法实参。
            //第二个参数callback,回调函数,表示异步调用结束时自动调用的函数。
            //第三个参数asyncState,用于向回调函数提供相关参数信息
            //返回值:IAsyncResult -->异步操作状态接口,封装了异步执行的中的参数
            //IAsyncResult接口成员:查看帮助文档
            IAsyncResult result = objMyCal.BeginInvoke(10,null,null);
            this.lblInfo1.Text = "正在计算....";
            this.lblInfo2.Text = ExecuteTask2(200).ToString();

            int r = objMyCal.EndInvoke(result);
            //委托类型的EndInvoke()方法:借助IasynResult接口对象,不断查询异步调用是否结束
            //该方法知道异步调用的所有参数,所以,异步调用结束后,取出异步调用结果作为返回值
            this.lblInfo1.Text = r.ToString();
        }

        private int ExecuteTask1(int num)
        {
            Thread.Sleep(5000);
            return num*num;
        }
        private int ExecuteTask2(int num)
        {
            return num * num;
        }
        //1 定义一个委托

        public delegate int MyCalculator(int num);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潘诺西亚的火山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值