web-dev-qa-db-fra.com

C # -Quatre modèles en 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 de délégué asynchrone: interrogation, en attente de fin, notification d'achèvement et "Fire and Forget"

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 modèle mis en œuvre par le code ci-dessus?

2) Pouvez-vous expliquer le code, comment puis-je implémenter le reste ..?

42
user215675

Ce que vous avez là-bas est le modèle de sondage. Dans ce modèle, vous demandez continuellement "Sommes-nous encore là?" La boucle while effectue le blocage. Le Thread.Sleep empêche le processus de consommer des cycles CPU.


L'attente de la fin est l'approche "Je vous appellerai".

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 que WaitOne est appelé, vous bloquez jusqu'à ce que l'escalade soit terminée. Vous pouvez effectuer d'autres tâches avant de bloquer.


Avec la notification d'achèvement, vous dites "vous m'appelez, je ne vous appellerai pas".

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 l'oubli seraient

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

Il n'y a pas non plus de blocage ici car vous ne vous souciez pas lorsque l'escalade est terminée. Comme son nom l'indique, vous l'oubliez. Vous dites "Ne m'appelez pas, je ne vous appellerai pas, mais quand même, ne m'appelez pas."

95
Bob
while (!ar.IsCompleted)
{
    Console.WriteLine("...Climbing yet to be completed.....");
    Thread.Sleep(200);
}

C'est un sondage classique. - Vérifiez, dormez, vérifiez à nouveau,

4
Chris Cudmore

Ce code est Polling:

while (!ar.IsCompleted)

C'est la clé, vous continuez de vérifier si elle est terminée ou non.

Ce code ne prend pas vraiment en charge 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 façons 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();
1
McKay