C# 回调函数,订阅次数的理解

       我自己,对于C#中的委托的机制,一直是在摸索着前行,对于这个机制每次使用都会加深一点对这个机制的理解。我就简单的说说我对这个机制的理解,首先需要订阅委托,当触发调用委托,回调函数就会响应被触发的委托。如代码所示:

 public partial class Form1 : Form
    {
        //订阅次数
        static int count;
        //回调函数执行次数
        static int num;
        public Form1()
        {
            InitializeComponent();
        }
        #region 一般情况下,委托的定义会封装在一个类里面,只提供函数的接口。
        //定义一个委托,为回调函数创建一个协议。
        public delegate void OnComplete(int i);
        //创建委托对象
        public OnComplete m_OnComplete = null;
        //一般情况下这个函数接口封装在一个类里面,对外只提供这个函数的接口。
        public void ShowResult(OnComplete onComplete)
        {
            //先卸载响应方法,确保回调函数只执行一次
            //m_OnComplete -= onComplete;
            //为委托新增响应处理方法
            m_OnComplete += onComplete;
        }
        //触发
        private void button1_Click(object sender, EventArgs e)
        {
            //调用委托对象
            if (m_OnComplete != null)
            {
                m_OnComplete(count);
            }
        }
        #endregion
        //响应触发的回调函数
        private void Complete(int i)
        {
            num++;
            Console.WriteLine("订阅"+i+"次。"+"触发完成,回调了"+num+"次\r\n");
        }
        //订阅
        private void button2_Click(object sender, EventArgs e)
        {
            count++;
            ShowResult(Complete);
        }

当我多次订阅委托时,我触发调用委托之后,回调函数就会被执行多次。执行结果如下图所示。

在有些情形下,我需要确保回调函数只被执行一次,即,我只需要订阅一次,我的思路是,在每次为委托新增方法前先卸载该方法。只需把上面的代码加上一行。如下图所示:

当我多次去执行订阅的过程,但实际上,我只订阅了一次委托,所以回调函数只执行一次。运行结果如下图所示:

以上就是一些自己的理解,实力尚浅,如果有理解错误的地方,还请大牛不啬赐教,在此表示感谢。

猜你喜欢

转载自blog.csdn.net/ezreal_pan/article/details/82183181