.Net BeginInvoke просто откладывает выполнение в другой поток. Это всегда будет медленнее, чем синхронный вызов, и потребляет дополнительные ресурсы. Единственная причина, по которой это можно было бы использовать, состоит в том, чтобы освободить контекст вызывающей стороны для перехода к другим операциям (например, вернуть клиенту результат HTTP-запроса).
Асинхронные методы SqlClient, когда свойство AsynchronousProcessing для соединения установлено в значение true и используются методы BeginExecute SqlCommand, являются действительно асинхронными. Команда SQL отправляется в сетевой канал связи, и завершение вызывается, когда результат возвращается сервером.
С точки зрения надежности, хотя ни один из этих методов не является полезным. Они оба полагаются на то, что клиентский процесс остается в стороне до завершения вызова, иначе SQL Server увидит, что клиент отключится и откажется от обработки, откатив любую промежуточную работу. Рассмотрим приложение ASP, которое приняло HTTP-запрос, отправило «асинхронную» обработку платежей и вернуло ответ. Нет никакого способа гарантировать, что представленная работа действительно произойдет.
В ситуациях, когда обработка требует надежности, гарантируется, что решение поставит в очередь работу на сервере, зафиксирует ее и затем продолжит работу, полагаясь на собственные возможности асинхронной обработки SQL Server. Это метод, который гарантирует обработку даже при наличии клиентских отключений, «перезапуске» процесса ASP, отказоустойчивости зеркалирования или кластеризации SQL Server, аппаратного аварийного восстановления, практически всего, что вы можете использовать, поскольку это надежный способ отправки транзакций. асинхронная обработка запросов. Пример см. Асинхронное выполнение процедур .