Question

J'essaie 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 modifie le texte d'une étiquette afin que l'utilisateur sache ce qui se passe. Cependant, le texte modifié n’est pas visible sur l’interface graphique (c’est-à-dire que le texte reste le même) jusqu’à APRÈS la ligne fullRestore.Wait ().

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

// Configure fullRestore

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

Ce qui est étrange, c’est que lblStatus affiche finalement "Restoring Database", mais pas avant après que la restauration soit terminée. Des idées?

Était-ce utile?

La solution

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

Autres conseils

C'est un problème de thread. Vous pouvez le faire sur des threads séparés ou sur un thread d'arrière-plan. Une approche que j'ai déjà vue utiliser consiste à effectuer une application.DoEvents () bien que je reste généralement à l'écart de cet appel.

La mise à jour de l'interface graphique ne peut pas avoir lieu 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 d'avant-plan de continuer à mettre à jour l'interface graphique. Envisagez de placer le code de restauration dans une méthode séparée et utilisez ThreadPool .QueueUserWorkItem () et en passant 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 davantage de contrôle sur le fil et la notification à la fin, vous pouvez utiliser un BackgroundWorker

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top