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);
}
}