回調(diào)函數(shù)(Callback Function)是一種函數(shù)指針,它指向的是由用戶自己定義的回調(diào)函數(shù)。我們將這個(gè)回調(diào)函數(shù)的指針作為參數(shù)傳遞給另外一個(gè)函數(shù),在這個(gè)函數(shù)工作完成后,它將通過這個(gè)回調(diào)函數(shù)的指針來回調(diào)通知調(diào)用者處理結(jié)果。
? ? 此定義來自網(wǎng)上;
看一個(gè)例子;這是用委托實(shí)現(xiàn)的回調(diào)函數(shù);
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); //定義一個(gè)委托類型
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);?
? ? 定義一個(gè)委托,無返回值,有一個(gè)整型參數(shù);
myFuncWithCallback是一個(gè)用戶定義函數(shù),一個(gè)帶有回調(diào)函數(shù)的函數(shù);
MyCallBack(int n)
{
.......
}
? ? 這是回調(diào)函數(shù)體;
new MyDelegate(MyCallBack),這是實(shí)例化委托;
單擊按鈕時(shí)調(diào)用了myFuncWithCallback,然后也會(huì)執(zhí)行回調(diào)函數(shù);
運(yùn)行如下;
假設(shè)不用回調(diào)函數(shù);代碼是如下,
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();
? ? ? ? }
? ? }
?功能也是一樣;
但是使用回調(diào)函數(shù)實(shí)現(xiàn)了異步;myFuncWithCallback和MyCallBack之間是異步的;
異步是什么?
異步
? ? 不用等所有操作等做完,就可以做其他的處理(比如發(fā)消息,發(fā)完后,我不需要等你回復(fù),就可以做其他處理)
同步
必須等所有的操作都做完,才返回給用戶結(jié)果;
再看一個(gè)例子;枚舉窗口,
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函數(shù)枚舉所有屏幕上的頂層窗口,并將窗口句柄傳送給應(yīng)用程序定義的回調(diào)函數(shù);運(yùn)行如下;
?
?文章來源:http://www.zghlxwxcb.cn/news/detail-709605.html
枚舉和打印輸出是異步的;?文章來源地址http://www.zghlxwxcb.cn/news/detail-709605.html
到了這里,關(guān)于C#回調(diào)函數(shù)學(xué)習(xí)1的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!