Асинхронный вызов хранимой процедуры SQL Server в C#

Действительно ли возможно назвать хранимую процедуру SQL Server асинхронно через C#?

У меня есть хранимая процедура, которая пишет резервное копирование определенной базы данных (это может занять много времени для завершения), и я хочу показать прогресс процесса резервного копирования в формы окон (для этого, я использую http://www.wisesoft.co.uk/articles/tsql_backup_restore_progress.aspx). Или я должен использовать управление Backgroundworker и выполнить SP в backgroundjob (собственный поток)?

14
задан ICodeGorilla 13 October 2014 в 15:49
поделиться

3 ответа

В вашем 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;
12
ответ дан 1 December 2019 в 14:21
поделиться

В любом случае я бы сделал это в отдельном потоке, поэтому я, вероятно, выбрал бы подход BackgroundWorker.

0
ответ дан 1 December 2019 в 14:21
поделиться