2009-06-17 8 views
1

Je tente d'utiliser un objet Microsoft.SqlServer.Management.Smo.Restore pour restaurer une base de données SQL Server 2000. Juste avant de commencer l'opération de restauration, je change le texte d'une étiquette pour que l'utilisateur sache ce qui se passe. Cependant, le texte modifié n'est pas visible sur l'interface graphique (c'est-à-dire, le texte reste le même) avant qu'après la ligne fullRestore.Wait().Label.Text change être bloqué?

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

// Configure fullRestore 

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

La chose étrange est, lblStatus ne éventuellement affichage « Restauration de base de données », mais pas avant après la restauration est terminée. Des idées?

Répondre

2

Vous bloquez le thread graphique, ce qui l'empêche de se mettre à jour. Vous pouvez appeler lblStatus.Refresh() ou déplacer votre Wait sur un thread d'arrière-plan (ce qui est finalement la bonne chose à faire).

+0

appel lblStatus.Refresh() ne fera aucune différence, tout ce qui est fait Invalide le contrôle de sorte qu'il sera repeindre, la repaint réelle ne peut toujours pas se produire jusqu'à ce que le thread graphique est disponible. –

+0

@Simon - il repeint avant l'appel qui verrouille le thread graphique. –

+0

Intéressant, j'ai juste essayé lblStatus.Refresh() et fait exactement ce dont j'ai besoin. Je sais qu'un thread d'arrière-plan pour Wait() serait une meilleure solution, mais c'est assez simple et fonctionne pour le moment. – Donut

0

C'est un problème de threading. Vous pouvez le faire sur des threads séparés ou sur un thread d'arrière-plan. Une approche que j'ai vu les gens utilisent est faire un Application.DoEvents() bien que je reste généralement loin de cet appel.

0

La mise à jour de l'interface graphique ne peut pas se produire tant que vous n'avez pas terminé le traitement sur le thread de premier plan et que vous l'avez libéré. Vous devez effectuer la restauration sur un thread d'arrière-plan pour permettre au thread de premier plan de continuer la mise à jour de l'interface graphique. Pensez à placer le code de restauration dans une méthode distincte et à utiliser ThreadPool.QueueUserWorkItem() et à passer la méthode de restauration. Cela déclenchera votre méthode de restauration sur un thread de pool de threads.

Si vous avez besoin de plus de contrôle sur le fil et la notification quand il a terminé, vous pouvez utiliser un BackgroundWorker