2010-04-13 46 views
5

Empecé a codificar en C# y nunca he tenido la oportunidad de utilizar devoluciones de llamada, aunque he utilizado delegados para el cableado de eventos. Cuál es la aplicación real de las devoluciones de llamada. Le agradecería si pudiera proporcionar algún enlace que explique las devoluciones de llamadas de manera directa sin los requisitos previos de C++.Devolución de llamada en C#

+0

¿La respuesta que encuentras debajo te puede ayudar? Si es así, márcalo como respuesta. Gracias. – gehho

+0

Hola Daniel, ¿Puedes seleccionar una respuesta y marcarla como respuesta? –

Respuesta

9

Una devolución de llamada es en realidad un delegado, es decir, una referencia a una función. Las devoluciones de llamada se utilizan a menudo en escenarios asíncronos (de subprocesos múltiples) para notificar al llamante cuando finaliza la operación asíncrona: el método asíncrono obtiene una devolución de llamada/delegado como parámetro y llama a este delegado una vez que ha finalizado su trabajo, es decir, "llamadas volver ". El uso de devoluciones/delegados permite que la persona que llama decida a qué operación se llama porque transfiere los parámetros.

Ejemplo:
Cuando el usuario inicia una operación de larga ejecución haciendo clic en un botón, se puede establecer el puntero del ratón a un WaitCursor e iniciar la operación de larga ejecución en otro hilo. Ahora, ¿cómo sabe cuándo puede restablecer el puntero del mouse al ArrowCursor normal? Respuesta: utilizando devoluciones de llamada. Simplemente crea un método que restablece el cursor a una flecha y luego pasa una referencia a este método (un delegado) como el parámetro de devolución de llamada. A continuación, se llama a este método cuando finalizó la operación y se restablece el cursor.

En realidad, los eventos también son un tipo de devoluciones de llamada: registra un delegado para recibir notificaciones cuando se produce un determinado evento. Cuando ocurre este evento, usted es llamado de nuevo usando el delegado proporcionado.

1

Cualquier acción asincrónica se basará en una devolución de llamada.

1

Una devolución de llamada es un delegado es un puntero de función. No creo que los hilos sean un requisito previo para las devoluciones de llamada.

0

Se utilizan para capturar los resultados de una acción ascrona.

1

Si está familiarizado con WPF, un buen ejemplo son las Propiedades de dependencia. Se registra a continuación, utilizando DependencyProperty.Register:

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

como el último parámetro, se pasa una función de los suyos que se llama por el marco cuando un trabajo que hay que hacer (validar el valor).

0

Delegate contiene una referencia a un método que lo hace el candidato ideal para la devolución de llamada.

He intentado explicarlo con un simple ejemplo: La clase Meditor actúa como un servidor de chat donde los controladores pueden iniciar sesión. Para comunicarse, los controladores deben implementar un método que actuará como método de devolución de llamada.

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? 
Cuestiones relacionadas