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 ..?
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."
while (!ar.IsCompleted)
{
Console.WriteLine("...Climbing yet to be completed.....");
Thread.Sleep(200);
}
C'est un sondage classique. - Vérifiez, dormez, vérifiez à nouveau,
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();