回调函数(Callback Function)是一种函数指针,它指向的是由用户自己定义的回调函数。我们将这个回调函数的指针作为参数传递给另外一个函数,在这个函数工作完成后,它将通过这个回调函数的指针来回调通知调用者处理结果。
此定义来自网上;
看一个例子;这是用委托实现的回调函数;
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;
namespace myhd1
{
public partial class Form1 : Form
{
private delegate void MyDelegate(int a); //定义一个委托类型
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
myFuncWithCallback(15, new MyDelegate(MyCallBack));
}
private void myFuncWithCallback(int b, MyDelegate callback)
{
int result = b * b;
callback(result);
}
private void MyCallBack(int n)
{
textBox1.Text = n.ToString();
}
}
}
private delegate void MyDelegate(int a);
定义一个委托,无返回值,有一个整型参数;
myFuncWithCallback是一个用户定义函数,一个带有回调函数的函数;
MyCallBack(int n)
{
.......
}
这是回调函数体;
new MyDelegate(MyCallBack),这是实例化委托;
单击按钮时调用了myFuncWithCallback,然后也会执行回调函数;
运行如下;
假设不用回调函数;代码是如下,
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
myFuncWithCallback(15);
}
private void myFuncWithCallback(int b)
{
int result = b * b;
MyCallBack(result);
}
private void MyCallBack(int n)
{
textBox1.Text = n.ToString();
}
}
功能也是一样;
但是使用回调函数实现了异步;myFuncWithCallback和MyCallBack之间是异步的;
异步是什么?
异步
不用等所有操作等做完,就可以做其他的处理(比如发消息,发完后,我不需要等你回复,就可以做其他处理)
同步
必须等所有的操作都做完,才返回给用户结果;
再看一个例子;枚举窗口,
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.Runtime.InteropServices;
namespace myhd2
{
public partial class Form1 : Form
{
public delegate void CallBack(int hwnd, int lParam);
[DllImport("user32")]
public static extern int EnumWindows(CallBack x, int y);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
CallBack myCallBack = new CallBack(Report);
EnumWindows(myCallBack, 0);
}
private void Report(int hwnd, int lParam)
{
textBox1.Text += "Window handle is " + hwnd.ToString() + ";" + Environment.NewLine;
}
}
}
Win32 api的EnumWindows函数枚举所有屏幕上的顶层窗口,并将窗口句柄传送给应用程序定义的回调函数;运行如下;
枚举和打印输出是异步的;