42 votes

Quatre modèles dans l'exécution asynchrone

J'ai entendu dire qu'il existe quatre modèles d'exécution asynchrone.

"Il existe quatre modèles dans l’exécution déléguée async: interrogation, attente d’achèvement, notification d’achèvement et" déclencher et oublier ".

Quand j'ai le code suivant:

 class AsynchronousDemo
{
    public static int numberofFeets = 0;
    public delegate long StatisticalData();

    static void Main()
    {
        StatisticalData data = ClimbSmallHill;
        IAsyncResult ar = data.BeginInvoke(null, null);
        while (!ar.IsCompleted)
        {
            Console.WriteLine("...Climbing yet to be completed.....");
            Thread.Sleep(200);

        }
        Console.WriteLine("..Climbing is completed...");
        Console.WriteLine("... Time Taken for  climbing ....{0}", 
        data.EndInvoke(ar).ToString()+"..Seconds");
        Console.ReadKey(true);

    }


    static long ClimbSmallHill()
    {
        var sw = Stopwatch.StartNew();
        while (numberofFeets <= 10000)
        {
            numberofFeets = numberofFeets + 100;
            Thread.Sleep(10);
        }
        sw.Stop();
        return sw.ElapsedMilliseconds;
    }
}
 

1) Quel est le motif implémenté par le code ci-dessus?

2) Pouvez-vous expliquer le code, comment puis-je mettre en œuvre le reste ..?

97voto

Bob Points 34449

Ce que vous avez là est le motif d'Interrogation. Dans ce modèle vous poser continuellement des "Sommes-nous encore là?" L' while boucle est en train de faire le blocage. L' Thread.Sleep empêche le processus de manger des cycles de PROCESSEUR.


Attendre la fin est le "je t'appelle" approche.

IAsyncResult ar = data.BeginInvoke(null, null);
//wait until processing is done with WaitOne
//you can do other actions before this if needed
ar.AsyncWaitHandle.WaitOne(); 
Console.WriteLine("..Climbing is completed...");

Donc dès qu' WaitOne est appelé bloquant jusqu'à ce que l'escalade est terminée. Vous pouvez effectuer d'autres tâches avant de les bloquer.


Avec l'Achèvement de Notification que vous dites "Vous m'appelez, je ne vais pas vous appeler."

IAsyncResult ar = data.BeginInvoke(Callback, null);

//Automatically gets called after climbing is complete because we specified this
//in the call to BeginInvoke
public static void Callback(IAsyncResult result) {
    Console.WriteLine("..Climbing is completed...");
}

Il n'y a pas de blocage ici, car Callback va être notifié.


Et le feu et oublier serait

data.BeginInvoke(null, null);
//don't care about result

Il ya aussi pas de blocage ici, parce que vous n'avez pas de soins lors de l'escalade est fini. Comme son nom l'indique, vous oublier. Vous dites: "Ne m'appelez pas, je ne vais pas vous appeler, mais encore, ne m'appelez pas."

4voto

Chris Cudmore Points 11133
 while (!ar.IsCompleted)
{
    Console.WriteLine("...Climbing yet to be completed.....");
    Thread.Sleep(200);
}
 

C'est un sondage classique. - Vérifier, dormir, vérifier à nouveau,

1voto

McKay Points 7281

Ce code est Polling:

 while (!ar.IsCompleted)
 

C'est la clé, vous continuez à vérifier si c'est terminé.

Ce code ne supporte pas vraiment les quatre, mais certains le font.

 Process fileProcess = new Process();
// Fill the start info
bool started = fileProcess.Start();
 

La méthode "Démarrer" est asynchrone. Il engendre un nouveau processus.

Nous pourrions faire chacune des manières que vous demandez avec ce code:

 // Fire and forget
// We don't do anything, because we've started the process, and we don't care about it

// Completion Notification
fileProcess.Exited += new EventHandler(fileProcess_Exited);

// Polling
while (fileProcess.HasExited)
{

}

// Wait for completion
fileProcess.WaitForExit();
 

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