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:
https://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;