J'ai un programme simple qui boucle dans un jeu de résultats quand un bouton est pressé et effectue des actions contre ce resultset (stocké dans un DataTable
). Pendant la boucle, je mets à jour le texte d'un RichTextBox
, 2 étiquettes, et un ToolStripStatusLabel
. Ceux-ci ne sont pas rafraîchissants pendant la boucle, donc après que chaque élément est traité dans la boucle, je fais un this.Refresh()
. Cela fonctionne à moins que je clique sur quelque chose dans le programme, à ce moment, il dit qu'il ne répond pas, et rien n'est actualisé dans le formulaire jusqu'à ce que la boucle foreach
se termine..NET Windows Forms Refresh Control
private void myBtn_Click(object sender, EventArgs e)
{
// Query database and store results in DataTable dt.
foreach (DataRow dr in dt.Rows)
{
// Process row data.
// Update RichTextBox, labels, and ToolStripStatusLabel.
this.Refresh();
}
}
Quelque chose ne va pas ici? Y a-t-il une meilleure manière de faire cela? Ceci est une application Windows Forms utilisant C#.
Si je déplace cette logique vers un thread d'arrière-plan, ne verrouille-t-elle pas également ce thread? Ou peut-être appeler le this.Refresh dans le fil principal à partir du fil d'arrière-plan? –
Votre thread d'arrière-plan serait occupé, mais cela n'affecterait pas l'interface graphique (votre programme resterait résonnant). Vous devrez également utiliser Invoke (ou BeginInvoke) pour modifier votre GUI à partir du thread d'arrière-plan. –
J'ai travaillé en traitant cette logique dans un environnement de travail et en mettant à jour l'interface utilisateur avec des délégués/invoke. Merci –