回调函数简介 C#回调函数用处非常广泛,最近在做一个图像检测项目,用的是海康威视的相机,C#编写Server/Client,相机SDK中对于实时码流处理都是借助回调函数,因此不好好研究一下回调函数,简直是没法工作(捂脸)。 网上有好多帖子介绍回调函数的,最简单的一种说法是: 回调函数是通过函数指针调用的函数,就是将函数作为参数传递给要执行的函数,作为参数的这个函数就是回调函数
回调函数的例子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public class SDK { public delegate void CallBack (string RealData ) ; private string videoStream_1 = "I am the video stream 1 and palying." ; private string videoStream_2 = "I am the video stream 2 and playing." ; public bool RealDataStream (int userID, CallBack callBack ) { if (userID == 1 ) { callBack(videoStream_1); return true ; } else if (userID == 2 ) { callBack(videoStream_2); return true ; } else { return false ; } } }
上面的代码是假设的相机SDK包,这个SDK类里面有两个字段videoStream_1和videoStream_2以及一个回调函数类定义CallBack,SDK类中还包含有视频取流的方法RealDateStream,这个方法需要传入两个参数,一个是用户ID,另一个就是回调函数,如果视频回调成功,会返回true,如果失败,返回false。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 class Program { static void Main (string [] args ) { int userID_1 = 1 ; int userID_2 = 2 ; int userID_3 = 3 ; SDK sdk = new SDK(); Program pp = new Program(); if (!sdk.RealDataStream(userID_1, pp.callbackFunction)) { Console.WriteLine("Some error happened." ); } if (!sdk.RealDataStream(userID_2, pp.callbackFunction)) { Console.WriteLine("Some error happened." ); } if (!sdk.RealDataStream(userID_3, pp.callbackFunction)) { Console.WriteLine("Some error happened." ); } } private void callbackFunction (string stream ) { Console.WriteLine(stream); } }
上面的代码是主程序,Program类中定义有回调函数callbackFunction,该回调函数需要按照SDK类中的回调函数public delegate void CallBack(string RealData)来定义,其中对string类型stream的实现非常简单:只是在控制台中打印stream(模拟处理实时视频流)。 Main函数中定义了三个字段userID-1,2,3,对于ID=1,2,SDK类中会输出相应的“视频流”,但是对于ID=3时,没有对应的“视频流”,因此会报错。代码的运行结果如下:
总结 实际二次开发时,SDK类会封装起来,二次开发时无法看到SDK类的实现方式,只会告诉二次开发的程序员SDK类的接口,二次开发的程序员可以通过自己编写回调函数,来实现自己想要达到的目的。