Quel est le meilleur moyen de mettre à jour les contrôles de formulaire à partir d'un thread de travail?

StackOverflow https://stackoverflow.com/questions/206867

  •  03-07-2019
  •  | 
  •  

Question

J'ai effectué des recherches et je ne trouve pas vraiment le moyen préféré pour mettre à jour les contrôles de formulaire à partir d'un thread de travail en C #. Je connais le composant BackgroundWorker, mais quel est le meilleur moyen de le faire sans utiliser le composant BackgroundWorker?

Était-ce utile?

La solution

Il existe une règle générale qui dit de ne pas mettre à jour l'interface utilisateur à partir d'un thread autre que celui de l'interface utilisateur. Utiliser les fonctionnalités de BackgroundWorker est une bonne idée, mais si vous ne voulez pas et que quelque chose se passe sur un autre thread, vous devez créer un "Invoke". ou BeginInvoke pour forcer le délégué à exécuter la méthode sur le thread d'interface utilisateur.

Modifier: Jon B a fait valoir ce bon point dans les commentaires:

  

N'oubliez pas qu'Invoke () est   synchrone et BeginInvoke () est   asynchrone. Si vous utilisez Invoke (), vous   faire attention à ne pas causer de   impasse. je recommanderais   BeginInvoke () sauf si vous avez vraiment besoin   l'appel à être synchrone.

Quelques exemples de code simples:

// Updates the textbox text.
private void UpdateText(string text)
{
  // Set the textbox text.
  m_TextBox.Text = text;
}

public delegate void UpdateTextCallback(string text);

// Then from your thread you can call this...
m_TextBox.Invoke(new UpdateTextCallback(this.UpdateText),
    new object[]{"Text generated on non-UI thread."});

Le code ci-dessus provient d'une FAQ à ce sujet ici ici .

Autres conseils

Pourquoi ne voulez-vous pas le faire avec BackgroundWorker? Il contient un événement de rappel fantastique appelé ProgressChanged qui permet au thread de l'interface utilisateur de connaître les mises à jour, parfait pour les mises à jour de type barre de progression et autres.

lien vers les détails

Il y a une discussion liée à ceci ici et un ici .

Vous utilisez essentiellement Invoke pour le réaliser.

Bonne chance!

Je considérerais également InvokeRequired (VS2008 uniquement) lors de l'appel de Invoke. Il arrive que vous ne mettiez pas à jour l'interface utilisateur à partir d'un thread séparé. Cela évite la surcharge liée à la création du délégué, etc.

if (InvokeRequired)
        {
            //This.Invoke added to circumvent cross threading exceptions.
            this.Invoke(new UpdateProgressBarHandler(UpdateProgressBar), new object[] { progressPercentage });
        }
        else
        {
            UpdateProgressBar(progressPercentage);
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top