.Net BeginInvoke simplemente pospone la ejecución en un hilo diferente. Esto siempre será más lento que una llamada síncrona y consumirá recursos adicionales. La única razón por la que esto se utilizaría sería liberar el contexto de la persona que llama para continuar con otras operaciones (por ejemplo, devolver el resultado de una solicitud HTTP al cliente).
Los métodos asíncronos SqlClient, cuando la propiedad AsynchronousProcessing en la conexión se establece en true y se usan los métodos BeginExecute de SqlCommand, son realmente asíncronos.El comando SQL se publica en el canal de comunicación de la red y la finalización se invoca cuando el servidor devuelve el resultado.
Desde un punto de vista de la fiabilidad aunque ninguno de estos métodos es útil sin embargo. Ambos dependen del proceso del cliente para quedarse hasta que se complete la llamada; de lo contrario, el servidor SQL vería al cliente desconectarse y abandonar el procesamiento, haciendo retroceder cualquier trabajo intermedio. Considere una aplicación ASP que aceptó una solicitud HTTP, envió un proceso de pago 'asíncrono' y devolvió una respuesta. No hay ninguna forma de garantizar que el trabajo enviado se realice realmente.
Para situaciones en las que el tratamiento requiere fiabilidad garantiza la solución es el trabajo hacen cola en el servidor, lo cometen y luego proceder, confiando en las propias capacidades de procesamiento asíncrono de SQL Server. Este es un método que garantiza el procesamiento incluso en presencia de desconexiones de clientes, proceso de ASP 'reciclaje', duplicación de SQL Server o failovers de clúster, recuperación ante desastres de hardware, casi cualquier cosa que pueda arrojar, ya que es una forma transaccionalmente duradera de enviar solicitudes de procesamiento asincrónico. Para un ejemplo vea Asynchronous Procedure Execution.
Creo que quiere decir "¿Por qué usar un proveedor de datos? BeginExecute ___()/EndExecute ____() 'frente a solo envolverlos en un delegado. –
@Joel: Hmm ... tal vez tengas razón. –