Действительно ли возможно назвать хранимую процедуру SQL Server асинхронно через C#?
У меня есть хранимая процедура, которая пишет резервное копирование определенной базы данных (это может занять много времени для завершения), и я хочу показать прогресс процесса резервного копирования в формы окон (для этого, я использую http://www.wisesoft.co.uk/articles/tsql_backup_restore_progress.aspx). Или я должен использовать управление Backgroundworker и выполнить SP в backgroundjob (собственный поток)?
В вашем SqlCommand
вы можете запускать команды асинхронно, используя BeginExecuteNonQuery
и EndExecuteNonQuery
. Последняя будет блокироваться до тех пор, пока не будет выполнена. Однако это не будет сообщать серверу о ходе резервного копирования - я бы использовал для этого маркерный индикатор выполнения.
Чтобы EndExecuteNonQuery
не блокировал ваш пользовательский интерфейс (в зависимости от того, как вы его обрабатываете), вам понадобится фоновый поток. Если вы используете его, то вы можете не использовать методы BeginXXX
EndXXX
и делать это синхронно в фоновом потоке - для этого лучше всего подходит BackgroundWorker
.
Чтобы избежать использования фонового потока в UI, вместо блокировки на EndXXX
вам нужно будет зарегистрировать обратный вызов и обработать полученное событие (вызывая EndXXX
в этом обработчике события, но он вернется немедленно).
Обновление: согласно комментарию, для асинхронных вызовов SQL-команд/соединений нужно указать столько же в строке соединения:
http://www.connectionstrings.com/sql-server-2008
Server=myServerAddress; Database=myDataBase; Integrated Security=True; Asynchronous Processing=True;
Или в коде, используя построитель строки соединения:
builder.AsynchronousProcessing = true;
В любом случае я бы сделал это в отдельном потоке, поэтому я, вероятно, выбрал бы подход BackgroundWorker.