Cos’è AsyncCallback?

Qual è l’uso di AsyncCallback e perché dovremmo usarlo?

Quando il metodo async termina l’elaborazione, viene chiamato automaticamente il metodo AsyncCallback , in cui è ansible eseguire istruzioni di post-elaborazione. Con questa tecnica non è necessario eseguire il polling o attendere il completamento del thread async .

Ecco alcune ulteriori spiegazioni sull’utilizzo di callback Async :

Modello di callback: il modello di callback richiede che specifichiamo un metodo per richiamare e includere qualsiasi stato di cui abbiamo bisogno nel metodo di callback per completare la chiamata. Il modello di callback può essere visto nel seguente esempio:

 static byte[] buffer = new byte[100]; static void TestCallbackAPM() { string filename = System.IO.Path.Combine (System.Environment.CurrentDirectory, "mfc71.pdb"); FileStream strm = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read, 1024, FileOptions.Asynchronous); // Make the asynchronous call IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(CompleteRead), strm); } 

In questo modello, stiamo creando un nuovo delegato AsyncCallback , che specifica un metodo per chiamare (su un altro thread) quando l’operazione è completa. Inoltre, stiamo specificando alcuni oggetti di cui potremmo aver bisogno come stato della chiamata. Per questo esempio, inviamo l’object stream perché dovremo chiamare EndRead e chiudere lo stream.

Il metodo che creiamo per essere chiamato alla fine della chiamata sarà simile a questo:

 static void CompleteRead(IAsyncResult result) { Console.WriteLine("Read Completed"); FileStream strm = (FileStream) result.AsyncState; // Finished, so we can call EndRead and it will return without blocking int numBytes = strm.EndRead(result); // Don't forget to close the stream strm.Close(); Console.WriteLine("Read {0} Bytes", numBytes); Console.WriteLine(BitConverter.ToString(buffer)); } 

Altre tecniche sono Wait-until-done e Polling .

Modello Wait-Until-Fatto Il modello wait-until-done consente di avviare la chiamata asincrona ed eseguire altri lavori. Una volta che l’altro lavoro è terminato, puoi tentare di terminare la chiamata e bloccherà fino al completamento della chiamata asincrona.

 // Make the asynchronous call strm.Read(buffer, 0, buffer.Length); IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, null, null); // Do some work here while you wait // Calling EndRead will block until the Async work is complete int numBytes = strm.EndRead(result); 

O puoi usare le maniglie di attesa.

 result.AsyncWaitHandle.WaitOne(); 

Modello di polling Il metodo di polling è simile, ad eccezione del fatto che il codice eseguirà il polling di IAsyncResult per verificare se è stato completato.

 // Make the asynchronous call IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, null, null); // Poll testing to see if complete while (!result.IsCompleted) { // Do more work here if the call isn't complete Thread.Sleep(100); } 

Pensare in questo modo. Hai alcune operazioni che vorresti eseguire in parallelo. Dovresti abilitare questo usando thread che vengono eseguiti in modo asincrono. Questo è un meccanismo di fuoco e dimentica.

Ma in alcune situazioni è necessario un meccanismo in cui è ansible triggersre e distriggersre, ma è necessario ricevere una notifica al termine dell’operazione. Per questo si usa una chiamata asincrona.

L’operazione è asincrona ma ti richiama al termine dell’operazione. Il vantaggio di questo è che non devi aspettare l’operazione fino al suo completamento. Sei libero di eseguire altre operazioni e quindi il tuo thread non è bloccato.

Un esempio di questo sarebbe un trasferimento in background di un file di grandi dimensioni. Mentre il trasferimento è in corso, non si desidera realmente impedire all’utente di eseguire altre operazioni. Una volta completato il trasferimento, il processo ti richiamerà su un metodo asincrono, in cui puoi probabilmente aprire una finestra di messaggio che dice “Trasferimento completato”

AsyncCallbacks vengono utilizzati per specificare una funzione da chiamare quando viene completata un’operazione asincrona. Ad esempio, se si stesse eseguendo un’operazione di I / O, si chiamerebbe BeginRead su un stream e si passerebbe un delegato AsyncCAllback. La funzione verrebbe chiamata al termine dell’operazione di lettura.

Per ulteriori informazioni, vedere:

  • Panoramica sui modelli asincroni basata sugli eventi
  • Utilizzo di un delegato AsyncCallback per terminare un’operazione asincrona