2009年9月29日星期二

回调(Call back)

手机双向收费,座机接电话免费,座机想打电话给手机,只是让手机振铃把电话号码告诉手机,手机根据电话号码Call Back座机,这就是回调名称的来源。
为了调用函数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

没有评论:

发表评论