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; }

浙公网安备 33010602011771号