¿Cuál es el uso de AsyncCallback y por qué deberíamos usarlo?¿Qué es AsyncCallback?
Respuesta
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 una explicación más en el uso Async
de devolución de llamada:
devolución de llamada Modelo: El modelo de devolución de llamada requiere que se especifica un método de devolución de llamada en e incluir cualquier estado que necesitamos en el método de devolución de llamada para completar la llamada. El modelo de devolución de llamada 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, se está creando un nuevo AsyncCallback
delegado, la especificación de un método a llamar (en otro hilo) cuando la operación se ha completado. 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 al EndRead
y cerrar la transmisión.
El método que creamos para ser llamado al final de la llamada sería algo como esto:
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-hasta-hecho y sondeo.
Esperar-Hecho Modelo El modelo de espera hasta el final le permite iniciar la llamada asincrónica 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 mangos de espera.
result.AsyncWaitHandle.WaitOne();
sondeo Modelo El método de votación es similar, con la excepción de que el código sondeará 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);
}
AsyncCallbacks se utilizan 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:
pensar 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 donde se puede disparar y olvidar, pero se necesita notificación cuando la operación finaliza. 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 le devolverá la llamada a un método asíncrono, donde probablemente pueda abrir un cuadro de mensaje que dice 'Transferencia completa'
explicación muy simple y agradable .. – amesh
excelente explicación –
- 1. AsyncCallback completedSynchronously
- 2. ¿Pasa el argumento a la función AsyncCallback?
- 3. Dos preguntas sobre el patrón AsyncCallback y IAsyncResult
- 4. ¿Cómo delego un método AsyncCallback para Control.BeginInvoke? (.NET)
- 5. ¿Cuán lejos se ejecutará GWT AsyncCallback mientras espera la respuesta?
- 6. ¿Se puede especificar el hilo en el que se ejecuta AsyncCallback cuando se utiliza delegate.BeginInvoke?
- 7. ¿Debería uno siempre llamar a EndInvocar a un delegado dentro de AsyncCallback?
- 8. C# new [delegate] no es necesario?
- 9. ¿Cómo reconocer qué es y qué no es recursividad final?
- 10. ¿Qué es y qué no es una historia de usuario?
- 11. ¿Qué es "matemática de cuerdas" y por qué es malo?
- 12. ¿Qué es WebIDL y (por qué) es importante?
- 13. ¿Qué es Mage y de qué manera es útil?
- 14. Android: ¿Qué es R? ¿Por qué es tan críptico?
- 15. ¿Qué es intptr?
- 16. ¿Qué es un Pagelet?
- 17. ¿Qué es NSCache?
- 18. ¿Qué es un UUID?
- 19. ¿Qué es NSNotification?
- 20. Qué es un Sandbox
- 21. ¿Qué es el escalamiento?
- 22. ¿Qué es exactamente NoSQL?
- 23. ¿Qué es un antipatrón?
- 24. Lua, ¿qué es Lua?
- 25. ¿Qué es exactamente "manejar"?
- 26. ¿Qué es un índice?
- 27. ¿Qué es _GLOBAL_OFFSET_TABLE?
- 28. ¿Qué es gcnew?
- 29. ¿Qué es un lote?
- 30. ¿Qué es UIViewControllerWrapperView?
'System.IO.Path.Combine' es una mejor manera de combinar rutas . –
Gracias. No sabía de Path.Combine. Han cambiado la respuesta según su sugerencia. –
¿Hay alguna manera de hacer esto para que CompleteRead sea una función no estática? – greggorob64