异步编程-提高篇

public FrmCalllBack()
{
    InitializeComponent();

    //【4】初始化委托变量
    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】根据委托定义一个方法

/// <summary>
/// :返回一个数的平方
/// </summary>
/// <param name="num">基数</param>
/// <param name="ms">延迟的时间:秒</param>
/// <returns></returns>
private int ExecuteTask(int num, int ms)
{
    System.Threading.Thread.Sleep(ms);
    return num * num;
}

【3】创建委托变量(因为异步函数和回调函数都要用,所以定义成员变量)

private MyCalculator objMyCal = null;

【5】同时执行多个任务

private void btnExec_Click(object sender, EventArgs e)
{
    for (int i = 1; i < 11; i++)//产生10个任务
    {
        //开始异步执行,并封装回调函数 objMyCal.BeginInvoke(10 * i, 1000 * i, null, i);
        objMyCal.BeginInvoke(10 * i, 1000 * i, MyCallBack, i);
        //最后一个参数 i 给回调函数的字段AsyncState赋值,如果数据很多可以定义成类或结构
    }
}

【6】回调函数

private void MyCallBack(IAsyncResult result)
{
    int res = objMyCal.EndInvoke(result);

    //异步显示结果:result.AsyncState字段用来封装回调时自定义的参数,object类型
    Console.WriteLine("第{0}个计算结果为:{1}", result.AsyncState.ToString(), res);
}

异步编程总结:

  1. 异步编程是建立在委托基础上的一种编程方法。
  2. 异步调用的每个方法都是在独立的线程中执行。因此,本质上就是一种多线程程序,也可以说是一种“简化版本”的多线程技术。
  3. 比较适合在后台运行较为耗费时间的《简单任务》,并且任务要求相互独立,任务中不应该有代码直接访问可视化控件。
  4. 如果后台任务要求必须按照特定顺序执行,或者必须访问共享资源,则异步编程不适合,而应该直接采用多线程开发技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值