2010-04-13 67 views
5

我开始使用C#编写代码,并且从来没有机会使用回调函数,尽管我使用委托进行事件接线。什么是回调的真正应用。如果您可以提供一些链接,以简单直接的方式解释回调而无需C++先决条件,我将不胜感激。C#中的回调函数#

+0

我的答案在下面有帮助吗?如果是这样,请将其标记为答案。谢谢。 – gehho 2010-04-14 06:24:45

+0

嗨丹尼尔,你能选择一个答案并将其标记为答案。 – 2010-04-14 13:52:06

回答

9

回调实际上是一个委托,即对函数的引用。回调通常用于异步(多线程)场景,以在异步操作完成时通知调用者:异步方法获取回调/委托作为参数,并在其完成工作后调用该委托,即它调用“调用回“。使用回调/委托使调用者可以决定调用哪个操作,因为他传递了参数。

例子:
当用户通过点击一个按钮,启动一个长期运行的操作,你可以设置鼠标指针WaitCursor,并开始在另一个线程的长时间运行的操作。现在,您如何知道何时可以将鼠标指针重置为正常的ArrowCursor?答:使用回调。您只需创建一个将光标重置为箭头的方法,然后将对此方法(委托)的引用作为回调参数传递。然后在操作完成时调用此方法,并且您的光标被重置。

事实上,事件也是某种回调:你注册了一个委托,当某个事件发生时被通知。当这个事件发生时,你使用提供的代表回拨

1

任何异步操作都将依赖于回调。

1

回调是一个委托是一个函数指针。我不认为线程是回调的先决条件。

0

它们用于捕获异步操作的结果。

1

如果您熟悉WPF,一个很好的例子是依赖属性。你注册,然后使用DependencyProperty.Register

public static DependencyProperty Register(
    string name, 
    Type propertyType, 
    Type ownerType, 
    PropertyMetadata typeMetadata, 
    ValidateValueCallback validateValueCallback 
) 

作为最后一个参数,你传递一个函数来完成你的由框架当某些工作需要叫(验证值)。

0

委托持有一个方法的引用,使其成为回调的理想候选者。

我试图用一个简单的例子来解释它: 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?