2 votes

Comment puis-je gérer "CrossThreadMessagingException"?

J'ai un code simple pour afficher une séquence temporelle dans mon interface graphique via un composant étiquette. Ce code se trouve dans l'événement tick d'un minuteur. Parfois, je reçois "Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessagingException" et je ne sais pas pourquoi? Comment puis-je attraper cette exception? Comment puis-je modifier mon code afin de ne pas obtenir cette exception?

    //Calculer et afficher le temps écoulé
    TimeSpan ElapsedTime = DateTime.Now - this.StartTime;
    this.LabelElapsedTime.Text = String.Format("{0:00}:{1:00}:{2:00}", ElapsedTime.Hours, ElapsedTime.Minutes, ElapsedTime.Seconds);

6voto

Jon Raynor Points 2312

Le problème le plus probable est que l'événement du minuteur accède au contrôle à partir d'un autre thread, comme dans l'événement Timer.Interval. Pour éviter ce problème, la propriété Control.InvokeRequired doit être vérifiée, et si elle est vraie, l'accès au contrôle doit être effectué en utilisant un délégué de la méthode Control.Invoke.

Un exemple de cela serait le suivant :

void UpdateLabel(Label lbl, String text)
{
    if (lbl.InvokeRequired)
    { lbl.Invoke(new Action(UpdateLabel), new object[] { lbl, text }); }
    else
    { lbl.Text = text; }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X