C#委托机制实现的回调函数

功能需求:在 frmMain 对象中 实例一个 AutoCallTelServer 对象。

                 需求是 AutoCallTelServer 对象中要能访问frmMain对象中的 GetFreeExterCh(string exterChannelList)  方法

AutoCallTelServer.cs

        //基于委托的回调模式  使用C#委托机制实现的回调
        //委托回调 一个对象将某个方法传递给另一个对象,让后者在特定时机调用前者
        //AutoCallTelServer 调用 frmMain 的方法   通过 GetFreeExterChCallBack() 实现
        //依赖注入 从外部注入依赖关系,而非在内部创建  通过 RegisterGetFreeExterCh 注入方法
        //控制反转 
        //通常时:frmMain 是调用方,AutoCallTelServer 是被调用方 通常是frmMain调用AutoCallTelServer的方法
        //注册后(注册回调方法  frmMain ──注册─→ GetFreeExterCh方法 ─→ AutoCallTelServer )
        //执行时:AutoCallTelServer 是调用方,frmMain 的方法是被调用方
        //控制反转:调用时机的控制权从 frmMain 转移到了 AutoCallTelServer
        //所以,在控制反转后,AutoCallTelServer 成为了调用方,它掌握了何时调用frmMain中获取空闲外线通道方法的控制权。
        public delegate string GetFreeExterChCallBack(string exterChannelList); //定义委托,回调函数,用于获取空闲外线通道 用于调用外部frmMain.cs中的GetFreeExterCh()方法
        private GetFreeExterChCallBack _getFreeExterChCallBack; // 用于引用frmMain.cs 获取空闲外线通道的方法
 
        //注册回调方法 GetFreeExterCh()方法的委托
        public void RegisterGetFreeExterCh(GetFreeExterChCallBack callBack)
        {
            this._getFreeExterChCallBack = callBack;
        }
        //调试用示例
        public string testApi()
        {
            // 安全调用:检查委托是否为null
            if (this._getFreeExterChCallBack != null)
            {
                string exterChannelList = "5,6,7";
                //执行frmMain.cs对象中的 GetFreeExterCh() 方法并获取返回值
                string result = this._getFreeExterChCallBack(exterChannelList);  
                return result;
            }
            else
            {
                //警告:未注册GetFreeExterCh()方法委托! 抛出明确的异常
                throw new InvalidOperationException("未注册GetFreeExterCh()方法委托,请先调用RegisterGetFreeExterCh()方法。");
            }
        }

frmMain.cs

AutoCallTelServer autoCallTelServer;

private void frmMain_Load(object sender, EventArgs e)
{
    //实例化AutoCallTelServer 
    autoCallTelServer = new AutoCallTelServer();
    //注册回调委托方法  
    autoCallTelServer.RegisterGetFreeExterCh(this.GetFreeExterCh);
}

//GetFreeExterCh 回调方法实现
public string GetFreeExterCh(string exterChannelList)
{
     //实现GetFreeExterCh方法的逻辑
     string strResult = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "  GetFreeExterCh()方法返回值: " + exterChannelList ;
     return strResult;
}

 

posted @ 2025-11-21 10:01  海乐学习  阅读(8)  评论(0)    收藏  举报