0%

C#回调函数

回调函数简介

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类的接口,二次开发的程序员可以通过自己编写回调函数,来实现自己想要达到的目的。