回调函数(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函数枚举所有屏幕上的顶层窗口,并将窗口句柄传送给应用程序定义的回调函数;运行如下;
枚举和打印输出是异步的;