W swoim SqlCommand
możesz uruchamiać polecenia asynchronicznie za pomocą BeginExecuteNonQuery
i EndExecuteNonQuery
. Ten ostatni zablokuje się, dopóki nie zostanie wykonany. Jednak nie będzie to raportować postępu z serwera o tym, jak przebiega tworzenie kopii zapasowej - użyłbym do tego paska postępu markizy.
Aby uniknąć EndExecuteNonQuery
blokowanie interfejsu użytkownika (w zależności od tego, jak sobie z nim radzisz), będziesz potrzebować wątku w tle. Jeśli używasz tego, możesz równie dobrze nie używać BeginXXX
EndXXX
metody i rób to synchronicznie w wątku w tle - BackgroundWorker
jest do tego najlepszy.
Aby uniknąć używania wątku w tle w interfejsie użytkownika, zamiast blokowania w EndXXX
będziesz musiał zarejestrować wywołanie zwrotne i obsłużyć powstałe zdarzenie (wywołanie EndXXX
w tym programie obsługi zdarzeń, ale wróci natychmiast).
Aktualizacja: jak w komentarzu, dla asynchronicznych wywołań do poleceń/połączeń SQL, musisz podać tyle samo w ciągu połączenia:
http://www.connectionstrings.com/sql-server-2008
Server=myServerAddress; Database=myDataBase; Integrated Security=True; Asynchronous Processing=True;
Lub w kodzie za pomocą konstruktora parametrów połączenia:
builder.AsynchronousProcessing = true;