我开始使用C#进行编码,虽然我已使用委托进行事件连接,但我从未有机会使用回调。回调的真正应用是什么。如果你能提供一些在没有C ++先决条件的情况下直接解释回调的链接,我将不胜感激。
答案 0 :(得分:9)
回调实际上是一个委托,即对函数的引用。回调通常用于异步(多线程)场景,以在异步操作完成时通知调用者:异步方法将回调/委托作为参数获取,并在完成其工作后调用此委托,即 “回电”。使用回调/委托使调用者能够决定调用哪个操作,因为他传入了参数。
示例:强>
当用户通过单击按钮启动长时间运行操作时,可以将鼠标指针设置为WaitCursor并在另一个线程上启动长时间运行操作。现在,您如何知道何时可以将鼠标指针重置为普通的ArrowCursor?答:使用回调。您只需创建一个方法,将光标重置为箭头,然后将此方法(委托)的引用作为回调参数传递。然后在操作完成时调用此方法,并重置光标。
实际上,事件也是某种回调:您注册一个代理,以便在发生特定事件时收到通知。发生此事件时,您使用提供的代理回调。
答案 1 :(得分:1)
任何异步操作都依赖于回调。
答案 2 :(得分:1)
回调是委托是一个函数指针。我不认为线程是回调的先决条件。
答案 3 :(得分:1)
如果您熟悉WPF,一个很好的例子是Dependency Properties。然后使用DependencyProperty.Register注册:
public static DependencyProperty Register(
string name,
Type propertyType,
Type ownerType,
PropertyMetadata typeMetadata,
ValidateValueCallback validateValueCallback
)
作为最后一个参数,当需要完成某些工作(验证值)时,您会传递一个由框架的 的函数。
答案 4 :(得分:0)
它们用于捕获异步操作的结果。
答案 5 :(得分:0)
Delegate持有对方法的引用,使其成为回调的理想候选者。
我试图用一个简单的例子来解释它: Meditor类就像一个控制器可以登录的聊天服务器。为了进行通信,控制器需要实现一个充当回调方法的方法。
public class Mediator
{
//instruct the robot to move.
public delegate void Callback(string sender, string receiver, Message msg);
Callback sendMessage;
//Assign the callback method to the delegate
public void SignOn(Callback moveMethod)
{
sendMessage += moveMethod;
}
public void SendMessage(string sender, string receiver, string msg)
{
sendMessage(sender, receiver, msg);
}
}
public class Controller : Asset
{
string readonly _name;
Mediator _mediator;
public Controller(Mediator m, string name)
{
_name = name;
_mediator = m;
//assign the call back method
_mediator.SignOn(Notification);
}
public void Notification(string sender, string receiver, string msg)
{
if (receiver == _name )
{
Console.WriteLine("{0}: Message for {1} - {2}".FormateText(sender,
receiver, msg)); //I have create extension method for FormatText.
}
}
public void Mobilize(string receiver, string msg)
{
_mediator.SendMessage(_name, receiver, msg);
}
}
static void Main(string[] args)
{
Mediator mediator;
mediator = new Mediator();
//accept name here...
Controller controller1 = new Controller(mediator, "name1");
Controller controller2 = new Controller(mediator, "name2");
controller1.Mobilize("name2","Hello");
controller1.Mobilize("name1", "How are you?");
}
output will be:
name1: Message for name2 - Hello
name2: Message for name1 - How are you?