• C#回调函数学习1


    回调函数(Callback Function)是一种函数指针,它指向的是由用户自己定义的回调函数。我们将这个回调函数的指针作为参数传递给另外一个函数,在这个函数工作完成后,它将通过这个回调函数的指针来回调通知调用者处理结果。

        此定义来自网上;

    看一个例子;这是用委托实现的回调函数;

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. namespace myhd1
    11. {
    12. public partial class Form1 : Form
    13. {
    14. private delegate void MyDelegate(int a); //定义一个委托类型
    15. public Form1()
    16. {
    17. InitializeComponent();
    18. }
    19. private void button1_Click(object sender, EventArgs e)
    20. {
    21. myFuncWithCallback(15, new MyDelegate(MyCallBack));
    22. }
    23. private void myFuncWithCallback(int b, MyDelegate callback)
    24. {
    25. int result = b * b;
    26. callback(result);
    27. }
    28. private void MyCallBack(int n)
    29. {
    30. textBox1.Text = n.ToString();
    31. }
    32. }
    33. }

    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之间是异步的;

    异步是什么?

    异步

        不用等所有操作等做完,就可以做其他的处理(比如发消息,发完后,我不需要等你回复,就可以做其他处理)

    同步

      必须等所有的操作都做完,才返回给用户结果;

    再看一个例子;枚举窗口,

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. using System.Runtime.InteropServices;
    11. namespace myhd2
    12. {
    13. public partial class Form1 : Form
    14. {
    15. public delegate void CallBack(int hwnd, int lParam);
    16. [DllImport("user32")]
    17. public static extern int EnumWindows(CallBack x, int y);
    18. public Form1()
    19. {
    20. InitializeComponent();
    21. }
    22. private void button1_Click(object sender, EventArgs e)
    23. {
    24. CallBack myCallBack = new CallBack(Report);
    25. EnumWindows(myCallBack, 0);
    26. }
    27. private void Report(int hwnd, int lParam)
    28. {
    29. textBox1.Text += "Window handle is " + hwnd.ToString() + ";" + Environment.NewLine;
    30. }
    31. }
    32. }

    Win32 api的EnumWindows函数枚举所有屏幕上的顶层窗口,并将窗口句柄传送给应用程序定义的回调函数;运行如下;
     


     

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

  • 相关阅读:
    vertx学习
    【libGDX】使用ShapeRenderer绘制几何图形
    Explain 性能分析
    C#常识篇(一)
    Redis 常用基本命令
    Vue/Vuex (actions) 核心概念 使用方法、辅助函数 mapActions使用方法说明
    在Idea中使用git
    SQL[游标+动态SQL+表函数]返回指定表名的某行的所有列合并后的值,主要提供给数据库表的更新记录事件
    C#窗体设计SaveFileDialog的用法
    小白C语言编程实战(15):演示插入排序
  • 原文地址:https://blog.csdn.net/bcbobo21cn/article/details/132868106