2010-11-16 6 views
1

Puis-je créer avec succès une minuterie sur un thread? J'en crée un mais ça ne semble pas fonctionner aussi bien. Mon application est une application multi-thread qui doit démarrer une minuterie sur un thread lorsque jamais un certain événement se produit. La minuterie est placée dans chaque connexion client. L'horloge ne fonctionne pas jusqu'à ce que je ferme ma winform (je ne sais pas pourquoi). Y at-il quelque chose en particulier que je devrais savoir sur les minuteurs dans les discussions?minuterie sur le filetage?

Voici mon code timer:

timer1.Interval = 1000; 
timer1.Tick += new EventHandler(timer_Tick); 
timer1.Enabled = true; 
timer1.Start(); 
+0

'timer1.Enabled' fait la même chose que' timer1.Start() ', si vous avez seulement besoin d'un d'entre eux. Essayez de configurer le temporisateur quelque part en dehors du thread et utilisez 'this.Invoke' pour appeler' timer1.Start() '. –

+0

Un détail intéressant qui est omis ici est * où, quand et comment le minuteur est créé *. L'exemple de code montre seulement comment il est démarré. –

+0

@Dittmar: J'ai besoin d'un minuteur pour chaque connexion client que j'accepte donc je dois le déclarer (très probablement) dans la classe qui définit ma connexion. @ fredrik je déclare le minuteur pour chaque connexion quand je crée la classe – Alex

Répondre

4

Vous pouvez essayer d'utiliser System.Threading.Timer, qui est essentiellement une minuterie qui est dans un thread séparé. Vous pouvez également envisager d'utiliser un WaitHandle qui n'a jamais été déclenché, puis d'utiliser WaitOne(1000, false) pour attendre une seconde.

+0

ainsi le temporisateur sur mon fil n'est pas censé fonctionner? – Alex

+0

Eh bien, je ne sais pas vraiment :-) Je vais essayer le 'System.Threading.Timer', car il ne dépend pas de Windows Forms comme le' System.Windows.Forms.Timer' - vous ne savez jamais. .. Comme vous créez le minuteur dans le code du thread de toute façon, il n'y a pas beaucoup de frais si vous changez de classe. –

+0

D'accord, je vais donner Threading.Timer un aller. Merci! – Alex

0

Essayez ceci:

public void EnableTimer() 
     { 
      if (this.InvokeRequired) 
       this.Invoke(new Action(EnableTimer)); 
      else 
       this.timer1.Enabled = true; 
     }