2009-11-27 5 views
1

J'utilise le system.timers.timer pour mon service.Comment accéder à un contrôle de formulaire à partir de System.Timers.Timer (problème de thread croisé)

Maintenant, je construis un formulaire de test dans lequel je l'utilise aussi. Dans l'événement timer_Elapsed, je fais un peu de travail et je veux arrêter la minuterie dont il a besoin (xxx ms) et l'écrire sur le contrôle de formulaire pour montrer. Mais quand j'accède à la liste, j'obtiens une erreur croisée.

Des idées?

Répondre

1

Si vous souhaitez accéder à un contrôle à partir d'un thread autre que le thread d'interface utilisateur principal, vous devez utiliser la méthode Invoke sur le contrôle auquel vous souhaitez accéder.

+0

Merci, mais je ne travaille jamais avec cela avant, pouvez-vous donner un exemple/un tutoriel pour cela? – Kovu

+0

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx Il y a un exemple de code en bas. – David

1

Votre méthode devrait ressembler à:

public void foo(int value, string message) 
    { 
     if (InvokeRequired) 
     { 
      BeginInvoke(new Action<int, string>(foo), value, message); 
     } 
     else 
     { 
      // Stop the timer 
     } 
    } 
1

Lorsque vous utilisez System.Timers.Timer, utilisez la propriété SynchronizingObject de la minuterie. Apparemment, cela provoque l'appel de la méthode qui gère l'événement Elapsed sur le même thread que le composant assigné (SynchronizingObject) a été créé. par ex. si myButton est un contrôle sur votre formulaire (quel que soit principal de fil GUI),

System.Timers.Timer myTimer = new System.Timers.Timer(); 
myTimer.SynchronizingObject = this.myButton; 

ce qui provoque le gestionnaire à exécuter sur Elapsed le même fil, supprime certaines erreurs « opération de fil croix ».

Pls Note: Je ne sais pas très bien si c'est thread-safe, mais a bien fonctionné pour moi dans un cas d'utilisation spécifique. J'espère que ça aide quand même.

Questions connexes