c# - microsoft - visual studio installer
C#-Four Patterns en ejecución asincrónica (3)
Escuché que hay cuatro patrones en la ejecución asincrónica.
"Hay cuatro patrones en la ejecución de delegado asíncrono: sondeo, espera de finalización, notificación de finalización y" Incendiar y olvidar ".
Cuando tengo el siguiente código:
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) ¿Cuál es el patrón implementado en el código anterior?
2) ¿Puedes explicar el código, cómo puedo implementar el resto ...?
Este código es de votación:
while (!ar.IsCompleted)
Esa es la clave, sigues comprobando si se completó o no.
Este código en realidad no admite los cuatro, pero algunos códigos sí.
Process fileProcess = new Process();
// Fill the start info
bool started = fileProcess.Start();
El método "Inicio" es Asíncrono. Engendra un nuevo proceso.
Podríamos hacer cada una de las formas que solicita con este código:
// 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();
Lo que tienes allí es el patrón de Votación. En este patrón continuamente pregunta: "¿Ya llegamos?" El ciclo while está haciendo el bloqueo. Thread.Sleep
evita que el proceso consuma ciclos de CPU.
Wait for Completion es el enfoque "te llamaré".
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...");
Entonces, tan pronto como se WaitOne
usted está bloqueando hasta que se complete la escalada. Puede realizar otras tareas antes de bloquear.
Con la notificación de finalización, dices "me llamas, no te llamaré".
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...");
}
No hay bloqueo aquí porque Callback
va a ser notificado.
Y disparar y olvidar sería
data.BeginInvoke(null, null);
//don''t care about result
Tampoco hay bloqueo aquí porque no te importa cuando termine la escalada. Como su nombre lo sugiere, te olvidas de eso. Estás diciendo "No me llames, no te llamaré, pero aún así, no me llames".
while (!ar.IsCompleted)
{
Console.WriteLine("...Climbing yet to be completed.....");
Thread.Sleep(200);
}
Esa es una encuesta clásica. - Revisa, duerme, revisa nuevamente,