Nel tuo SqlCommand puoi eseguire comandi in modo asincrono usando BeginExecuteNonQuery e EndExecuteNonQuery . Quest'ultimo si bloccherà fino al termine. Tuttavia questo non riporterà i progressi dal server su come sta andando il backup:userei una barra di avanzamento di selezione per questo.
Per evitare EndExecuteNonQuery dal bloccare la tua interfaccia utente (a seconda di come la gestisci), avrai bisogno di un thread in background. Se lo usi, potresti anche non utilizzare BeginXXX EndXXX metodi e farlo in modo sincrono su un thread in background:il BackgroundWorker è il migliore per questo.
Per evitare di utilizzare un thread in background nell'interfaccia utente, invece di bloccare su EndXXX dovrai registrare una richiamata e gestire l'evento risultante (chiamando EndXXX in questo gestore di eventi, ma tornerà immediatamente).
Aggiornamento: come per un commento, per le chiamate asincrone al comando SQL/al materiale di connessione, è necessario specificarlo nella stringa di connessione:
https://www.connectionstrings.com/sql-server-2008
Server=myServerAddress; Database=myDataBase; Integrated Security=True; Asynchronous Processing=True;
O nel codice usando il generatore di stringhe di connessione:
builder.AsynchronousProcessing = true;