为了调用函数A,将函数A作为参数传递给函数B,让B来调用(Call Back)函数A。
B(函数指针 p)
{
call p
};
mai()
{
A()
{
...
}
B(A);
}
这样做的优点是B函数可以根据需要,调用不同的函数A1,A2...,另外回调的最主要应用是实现异步调用(Asynchronous),在上面的示例中,如果A函数的处理非常花费时间,直接调用A会导致程序失去响应,但是通过回调,由于B能迅速返回,A会单独起一个线程。
下面是一个C#中完整的用delegate实现的Call Back,DBManager类实现实时列举所有的数据库活动链接(假设它运行在服务器端),显然希望客户端在列举活动链接的时候能迅速返回,同时服务器端提供给客户端回调函数callback,让客户端自由的决定显示方式。
using System;
class DBConnection
{
public DBConnection(string name)
{
this.name = name;
}
protected string Name;
public string name
{
get
{
return this.Name;
}
set
{
this.Name = value;
}
}
}
class DBManager
{
static DBConnection[] activeConnections;
public void AddConnections()
{
activeConnections = new DBConnection[5];
for (int i = 0; i < 5; i++)
{
activeConnections[i] = new DBConnection("DBConnection " + (i + 1));
}
}
public delegate void EnumConnectionsCallback(DBConnection connection);
public static void EnumConnections(EnumConnectionsCallback callback)
{
foreach (DBConnection connection in activeConnections)
{
callback(connection);
}
}
}
class Delegate1App
{
public static void ActiveConnectionsCallback(DBConnection connection)
{
Console.WriteLine("Callback method called for "
+ connection.name);
}
public static void Main()
{
DBManager dbMgr = new DBManager();
dbMgr.AddConnections();
DBManager.EnumConnectionsCallback myCallback = new DBManager.EnumConnectionsCallback(ActiveConnectionsCallback);
DBManager.EnumConnections(myCallback);
}
}
编译,执行后的输出结果:
Callback method called for DBConnection 1
Callback method called for DBConnection 2
Callback method called for DBConnection 3
Callback method called for DBConnection 4
Callback method called for DBConnection 5
没有评论:
发表评论