2010-04-13 12 views
5

Ho iniziato la codifica in C# e non ho mai avuto l'opportunità di utilizzare i callback anche se ho usato delegati per il cablaggio degli eventi. Qual è la vera applicazione dei callback. Ti sarei grato se potessi fornire un link che spiega i callback in modo diretto senza prerequisiti C++.Richiamate in C#

+0

La mia risposta di seguito ti è stata d'aiuto? In tal caso, contrassegnarlo come risposta. Grazie. – gehho

+0

Ciao Daniel, puoi selezionare una risposta e contrassegnarla come risposta. –

risposta

9

Un callback è in realtà un delegato, ovvero un riferimento a una funzione. Le callback vengono spesso utilizzate in scenari asincroni (multi-thread) per notificare il chiamante al termine dell'operazione asincrona: il metodo asincrono riceve un callback/delegate come parametro e chiama questo delegato dopo aver terminato il proprio lavoro, ovvero chiamate " indietro ". L'uso di callback/delegati consente al chiamante di decidere quale operazione viene chiamata perché passa nei parametri.

Esempio:
Quando l'utente avvia un'operazione di esecuzione lungo cliccando su un pulsante, è possibile impostare il puntatore del mouse a un WaitCursor e avviare l'operazione di lungo in esecuzione su un altro thread. Ora, come fai a sapere quando puoi reimpostare il puntatore del mouse sul normale ArrowCursor? Risposta: utilizzo di callback. È sufficiente creare un metodo che reimposta il cursore su una freccia e quindi passa un riferimento a questo metodo (un delegato) come parametro di callback. Quindi questo metodo viene chiamato al termine dell'operazione e il tuo cursore viene ripristinato.

In realtà, gli eventi sono anche una sorta di callback: si registra un delegato per ricevere una notifica quando si verifica un determinato evento. Quando si verifica questo evento, si è richiamato utilizzando il delegato fornito.

1

Qualsiasi azione asincrona si baserà su un callback.

1

Un callback è un delegato è un puntatore a funzione. Non penso che i thread siano un prerequisito per i callback.

0

Vengono utilizzati per acquisire i risultati di un'azione asincrona.

1

Se si ha familiarità con WPF, un buon esempio sono le proprietà di dipendenza. Si registra quindi utilizzando DependencyProperty.Register:

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

come ultimo parametro, si passa una funzione tuo che si chiama dal framework quando un certo lavoro deve essere fatto (convalidando il valore).

0

Delegato contiene un riferimento a un metodo che lo rende candidato ideale per la richiamata.

Ho cercato di spiegarlo con un semplice esempio: La classe Meditor si comporta come un server di chat in cui i controllori possono accedere. Per poter comunicare, i controllori devono implementare un metodo che funga da metodo di callback.

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? 
Problemi correlati