84 votes

Qu'est-ce que AsyncCallback?

Bonjour, j'ai vu le AsyncCallback dans de nombreux programmes client-serveur. Quelle est l'utilisation de AsyncCallback et pourquoi devrions-nous l'utiliser?

146voto

Rashmi Pandit Points 9341

Lorsque la méthode async terminer le traitement, AsyncCallback méthode est appelée automatiquement, d'où le post-traitement stmts peut être exécutée. Avec cette technique, il n'y a pas besoin de sondage ou d'attendre le thread asynchrone à compléter.

C'est une explication sur Aynsc de retour d'Appel d'utilisation:

Rappel du Modèle: Le modèle de rappel nous impose de spécifier une méthode de rappel sur et comprennent tout l'état que nous avons besoin dans la méthode de rappel pour terminer l'appel. Le modèle de rappel peut être vu dans l'exemple suivant:

static byte[] buffer = new byte[100];

static void TestCallbackAPM()
{
    string filename = System.IO.Path.Combine (System.Environment.CurrentDirectory, "mfc71.pdb");

    FileStream strm = new FileStream(filename,
        FileMode.Open, FileAccess.Read, FileShare.Read, 1024,
        FileOptions.Asynchronous);

    // Make the asynchronous call
    IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length,
        new AsyncCallback(CompleteRead), strm);
}

Dans ce modèle, la création d'une nouvelle AsyncCallback délégué, la spécification d'une méthode à appeler (sur un autre thread) lorsque l'opération est terminée. En outre, nous sommes en spécifiant un objet que nous pourrions avoir besoin de l'état de l'appel. Pour cet exemple, nous envoyons l'objet de flux de données en car nous aurons besoin d'appeler EndRead et fermer le flux de données.

La méthode que nous avons créer pour être appelé à la fin de l'appel serait de ressembler à quelque chose comme ceci:

static void CompleteRead(IAsyncResult result)
{
    Console.WriteLine("Read Completed");

    FileStream strm = (FileStream) result.AsyncState;

    // Finished, so we can call EndRead and it will return without blocking
    int numBytes = strm.EndRead(result);

    // Don't forget to close the stream
    strm.Close();

    Console.WriteLine("Read {0} Bytes", numBytes);
    Console.WriteLine(BitConverter.ToString(buffer));
}

D'autres techniques sont en attente jusqu'à ce que-faire et d'interrogation.

Attendre Jusqu'à ce que Fait le Modèle de L'attente-jusqu'à-fait modèle permet de lancer l'appel asynchrone et effectuer d'autres travaux. Une fois que le travail est fait, vous pouvez tenter de mettre fin à l'appel et il permet de bloquer jusqu'à ce que l'appel asynchrone est terminée.

// Make the asynchronous call
strm.Read(buffer, 0, buffer.Length);
IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, null, null);

// Do some work here while you wait

// Calling EndRead will block until the Async work is complete
int numBytes = strm.EndRead(result);

Ou vous pouvez utiliser attendez poignées.

result.AsyncWaitHandle.WaitOne();

Modèle de bureau de vote Le bureau de vote de la méthode est similaire, à l'exception que le code s'interroger la IAsyncResult pour voir si elle a terminé.

// Make the asynchronous call
IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, null, null);

// Poll testing to see if complete
while (!result.IsCompleted)
{
    // Do more work here if the call isn't complete
    Thread.Sleep(100);
}

32voto

Bobby Alexander Points 1155

Pensez-y de cette façon. Vous avez quelques opérations que vous souhaitez exécuter en parallèle. Vous devez activer ce par l'utilisation de threads qui s'exécute de façon asynchrone. C'est un feu et oublier mécanisme.

Mais certaines situations exigent un mécanisme où vous pouvez incendie et pour l'oublier, mais besoin de notification lorsque l'opération est terminée. Pour cela, vous devez utiliser un appel asynchrone de retour.

Le fonctionnement est asynchrone, mais vous appelle en arrière quand l'opération est terminée. L'avantage, c'est que vous n'avez pas à attendre sur l'opération jusqu'à ce qu'elle se termine. Vous êtes libre d'exécuter d'autres opérations et donc votre thread n'est pas bloqué.

Un exemple de ceci serait un transfert de fond d'un gros fichier. Alors que le transfert est en cours, vous ne voulez vraiment pour empêcher l'utilisateur de faire d'autres opérations. Une fois que le transfert est terminé, le processus vous rappellera sur une méthode asynchrone, où vous pouvez probablement s'afficher une boîte de message qui dit "Transfert terminé"

4voto

heavyd Points 8845

AsyncCallbacks sont utilisés pour spécifier une fonction à appeler lorsqu'une opération asynchrone est terminée. Par exemple, si vous aviez fait une opération e / s que vous appelez BeginRead sur un stream et passez un AsyncCAllback délégué. La fonction sera appelée lorsque l'opération de lecture est terminée.

Pour plus d'informations, voir:

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X