¿Qué es AsyncCallback?

¿Para qué sirve AsyncCallback y por qué deberíamos usarlo?

Cuando el método async finaliza el procesamiento, se llama automáticamente al método AsyncCallback , donde se pueden ejecutar las instrucciones posteriores al procesamiento. Con esta técnica no hay necesidad de sondear o esperar a que se complete el subproceso async .

Aquí hay más explicaciones sobre el uso de la callback Async :

Modelo de callback : El modelo de callback requiere que especifiquemos un método para la callback e incluyamos cualquier estado que necesitemos en el método de callback para completar la llamada. El modelo de callback se puede ver en el siguiente ejemplo:

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

En este modelo, estamos creando un nuevo delegado AsyncCallback , que especifica un método para llamar (en otro subproceso) cuando se completa la operación. Además, estamos especificando algún objeto que podríamos necesitar como el estado de la llamada. Para este ejemplo, estamos enviando el objeto de transmisión porque necesitaremos llamar a EndRead y cerrar la transmisión.

El método que creamos para llamar al final de la llamada se vería así:

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

Otras técnicas son Wait-until-done y Polling .

Modelo de espera hasta el finalización El modelo de espera hasta el finalización le permite iniciar la llamada asíncrona y realizar otro trabajo. Una vez que haya terminado el otro trabajo, puede intentar finalizar la llamada y se bloqueará hasta que se complete la llamada asincrónica.

 // 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 puede usar los controles de espera.

 result.AsyncWaitHandle.WaitOne(); 

Modelo de sondeo El método de sondeo es similar, con la excepción de que el código IAsyncResult el IAsyncResult para ver si se ha completado.

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

Piénsalo de esta manera. Tiene algunas operaciones que le gustaría ejecutar en paralelo. Usted habilitaría esto usando hilos que se ejecutan de forma asíncrona. Este es un mecanismo de fuego y olvido.

Pero algunas situaciones requieren un mecanismo en el que pueda disparar y olvidar, pero necesita notificación cuando la operación finalice. Para esto, usarías una llamada asíncrona.

La operación es asíncrona pero te devuelve la llamada cuando finaliza la operación. La ventaja de esto es que no tiene que esperar la operación hasta que finalice. Eres libre de ejecutar otras operaciones y, por lo tanto, tu hilo no está bloqueado.

Un ejemplo de esto sería una transferencia de fondo de un archivo grande. Mientras la transferencia está en progreso, realmente no quiere bloquear al usuario para que no realice otras operaciones. Una vez que se completa la transferencia, el proceso lo devolverá a un método asíncrono, donde probablemente pueda abrir un cuadro de mensaje que dice ‘Transferencia completa’.

Los AsyncCallbacks se usan para especificar una función para llamar cuando se completa una operación asincrónica. Por ejemplo, si estuvieras haciendo una operación IO, llamarías a BeginRead en una transmisión y pasarías un delegado AsyncCAllback. La función se invocará cuando se complete la operación de lectura.

Para más información, ver:

  • Visión general del patrón asíncrono basado en eventos
  • Usar un Delegado AsyncCallback para finalizar una operación asincrónica