Domanda

Sto tentando di utilizzare un oggetto Microsoft.SqlServer.Management.Smo.Restore per ripristinare un database di SQL Server 2000. Poco prima di iniziare l'operazione di ripristino, cambio il testo di un'etichetta in modo che l'utente sappia cosa sta succedendo. Tuttavia, il testo modificato non è visibile sulla GUI (ovvero, il testo rimane lo stesso di quello che era) fino a DOPO la riga fullRestore.Wait ().

lblStatus.Text = "Restoring Database";
Restore fullRestore = new Restore(); 

// Configure fullRestore

fullRestore.SqlRestore(_server);
fullRestore.Wait();

La cosa strana è che lblStatus alla fine visualizza "Ripristino del database", ma non fino a dopo il ripristino è completo. Qualche idea?

È stato utile?

Soluzione

Stai bloccando il thread della GUI, che gli impedisce di aggiornarlo. Puoi chiamare lblStatus.Refresh () o spostare la tua attesa su un thread in background (che alla fine è la cosa giusta da fare).

Altri suggerimenti

È un problema di threading. Puoi farlo su thread separati o su un thread in background. Un approccio che ho visto usare la gente è fare un Application.DoEvents () anche se in genere sto lontano da quella chiamata.

L'aggiornamento alla GUI non può avvenire fino al termine dell'elaborazione sul thread in primo piano e dopo averlo rilasciato. È necessario eseguire il ripristino su un thread in background per consentire al thread in primo piano di continuare ad aggiornare la GUI. Prendi in considerazione l'idea di inserire il codice di ripristino in un metodo separato e di utilizzare ThreadPool .QueueUserWorkItem () e passando il metodo di ripristino. Ciò attiverà il tuo metodo di ripristino su un thread del pool di thread.

Se hai bisogno di maggiore controllo sul thread e sulla notifica al termine, puoi utilizzare BackgroundWorker

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top