2009-11-23 13 views
39

Escuché que hay cuatro patrones en la ejecución asincrónica.C# -Four Patterns in Asynchronous execution

"Hay cuatro patrones en la ejecución delegado asincrónica: sondeo, esperar a la finalización, Notificación de finalización, y 'dispara y olvida'

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 del código implementado?

2) ¿puede explicar el código, ¿Cómo puedo aplicar el resto ..?

+18

Ojalá hubiera tenido Stack Overflow para hacer mi tarea de Informática cuando estaba en la Universidad ...:) –

Respuesta

87

Lo que tiene allí es el patrón de sondeo. En este patrón continuamente pregunta: "¿Ya llegamos?" El ciclo while está bloqueando. El 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..."); 

Así que tan pronto como se llama WaitOne estás bloqueando hasta que la escalada es completa. Puede realizar otras tareas antes de bloquear.


Con la notificación de finalización está diciendo "me llama, no le 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 Callback aquí porque va a ser notificado.


Y dispara y olvida sería

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

También hay ningún bloqueo aquí porque no se preocupan cuando se termina 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".

+0

+1 Me pegó. –

+1

Si no te importa, ¿puedes por favor comparar esos patrones en términos de consumo de tiempo? – user215675

+1

¿A qué te refieres en términos de consumo de tiempo? – Bob

0

Este código es Sondeo:

while (!ar.IsCompleted) 

Esa es la clave, a mantener la comprobación de si o no se ha completado.

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 en las 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(); 
2
while (!ar.IsCompleted) 
{ 
    Console.WriteLine("...Climbing yet to be completed....."); 
    Thread.Sleep(200); 
} 

Eso es clásico de votación. - Comprobar, dormir, verificar de nuevo,