当前位置: 首页 > news >正文

C#回调函数学习1

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


 

枚举和打印输出是异步的; 

http://www.lryc.cn/news/168452.html

相关文章:

  • leetcode 232 用栈实现队列
  • element UI表单验证,自定义验证规则
  • redis 主存复制
  • Unity Shader顶点数据疑问
  • java写一个用于生成雪花id的工具类
  • 淘宝开店装修教程 (2023新版)
  • Python傅立叶变换
  • MATLAB向量化编程基础精讲教程
  • 【非对称加密算法】RSA算法
  • 【滑动窗口】438. 找到字符串中所有字母异位词
  • 【PowerQuery】Excel 一分钟以内刷新PowerQuery数据
  • 【C语言】用冒泡排序实现my_qsort
  • 【css】深入理解flex属性
  • 前端项目开发流程
  • MybatisPlus逆向工程入门指南:让你的开发更高效、更简洁、更优雅
  • 通用商城项目(下)
  • k8s集群使用ingress转发grafana服务
  • MongoDB的备份和恢复
  • Pytorch学习笔记(GPU训练)
  • 一款开源的shell脚本分析工具
  • HTML <video> 标签
  • mac 本地运行 http-proxy-middleware ,请求超时
  • 【Effective Python】读书笔记-05类与接口
  • 【办公自动化】用Python在Excel中查找并替换数据(文末送书)
  • python学习随笔3
  • 《TCP/IP网络编程》阅读笔记--epoll的使用
  • Python 递归函数
  • Java实现计算两个日期之间的工作日天数
  • CS5817规格书|CS5817芯片参数|多功能便携式显示器方案芯片规格
  • 2023面试知识点一