2009-11-23 11 views
39

Ho sentito che ci sono quattro modelli nell'esecuzione asincrona.C# - Quattro modelli in esecuzione asincrona

"Ci sono quattro modelli in esecuzione delegato asincrono: Polling, in attesa del completamento, notifica di completamento, e " fire and forget"

Quando ho il seguente codice:

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) Qual è lo schema implementato nel codice sopra riportato?

2) Puoi spiegare il codice, come posso implementare il resto ..?

+18

Vorrei aver avuto Stack Overflow per fare i miei compiti di Computer Science per me quando ero all'Università ...:) –

risposta

87

Quello che hai è il modello di Polling. In questo schema chiedi continuamente "Siamo già arrivati?" Il ciclo while sta eseguendo il blocco. Thread.Sleep impedisce al processo di consumare i cicli della CPU.


Attendere il completamento è l'approccio "Ti chiamo".

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..."); 

Così, non appena WaitOne si chiama si sta bloccando fino a quando l'arrampicata è completa. È possibile eseguire altre attività prima di bloccare.


Con notifica di completamento che si stanno dicendo "Tu mi chiami, io non ti chiamerò".

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..."); 
} 

Non v'è alcun blocco qui perché Callback sta per essere notificato.


E il fuoco e dimenticare sarebbe

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

Non c'è inoltre il blocco qui perché non si cura quando si sale è finito. Come suggerisce il nome, te ne dimentichi. Stai dicendo "Non chiamarmi, non ti chiamo, ma ancora, non chiamarmi".

+0

+1 Picchiami. –

+1

Se non ti dispiace, puoi confrontare questi schemi in termini di consumo di tempo? – user215675

+1

Cosa intendi in termini di consumo di tempo? – Bob

0

Questo codice è Polling:

while (!ar.IsCompleted) 

questa è la chiave, perdere anche se non è stato completato.

Questo codice in realtà non supporta tutti e quattro, ma alcuni lo fanno.

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

Il metodo "Start" è Asincrono. Genera un nuovo processo.

Potremmo fare ciascuno dei modi in cui è richiesta con questo codice:

// 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); 
} 

Questo è polling classico. - Controlla, dormi, controlla di nuovo,

Problemi correlati