Comment faire un C# timer qui déclenche des événements dans le thread principal?

Longue histoire courte, j'ai besoin d'une précision de temporisation .Net - avec prescision en millisecondes - sens, si je lui dis de mettre le feu à un événement lors de 10ms passe, il doit le faire, à +-1ms. L'intégré .Net classe Timer a une précision de +-16 ms il me semble, ce qui est inacceptable pour mon application.

J'ai trouvé cet article http://www.codeproject.com/Articles/98346/Microsecond-and-Millisecond-NET-Timer qui fournit un code pour une minuterie, ce qui est exactement ce dont j'ai besoin (même plus - que a la précision en microsecondes).

Cependant, le problème est, la OnTimer équivalent semble être exécutée dans un autre thread. Donc, si j'ai ajouter un peu de code qui ne, dire:

label1.Text = "Hello World";

Je vais avoir une exception, et donc je vais devoir le fait de l'écrire comme ceci:

Invoke( new MethodInvoker(() =>{label1.Text = "Hello World";}));

C'est, d'après ce que je comprends, parce que l'événement OnTimer est tiré de la minuterie fil où le temps est passé jusqu'à ce que suffisamment a réussi à être au-dessus de l'Intervalle, puis cliquez sur suivant OnTimer événement est déclenché. L' .Net de la Minuterie n'a pas ce problème - OnTimer de la .Net Timer, je peut librement modifier les commandes des membres.

Question: Que dois-je changer pour que mon minuteur va exécuter l'événement OnTimer dans le thread principal? Est l'ajout de "Invoquer" le seul choix?

  • La seule raison pour laquelle les Formes de la minuterie ne souffre pas c'est parce qu'il Invoque en votre nom à titre de commodité. Si vous utilisez d'autres compteurs à zéro, vous devez Appeler comme vous le décrivez dans votre question.
  • Il est probablement utile de rappeler que Windows est pas un système d'exploitation temps réel. En essayant de faire quelque chose arrive à 1ms, la précision peut être délicat.
  • Pourquoi avez-vous besoin d'un tel débit? Vous ne seriez jamais capable de mettre à jour l'INTERFACE utilisateur rapide. De toute façon, les windows forms de la minuterie est le chemin à parcourir. C'est un wrapper pour un OS timer qui déclenche le thread d'INTERFACE utilisateur, et c'est la chose la plus rapide que vous trouverez qui le fait.
  • Je me demande pourquoi vous avez besoin d'une précision de 1 milliseconde pour la modification d'une étiquette si votre écran a une latence de quelques millisecondes.
  • Oui j'ai un peu compris, dans le processus de l'écriture du code, que, même à 120Hz moniteur nous avons encore un GUI de précision de 8ms, car nous ne pouvons changer les cadres, chaque 8ms. Donc, il n'y a pas beaucoup de point à la lutte pour la précision dans l'INTERFACE utilisateur de la partie. Cependant, il n'est pas seulement à propos de l'INTERFACE utilisateur, de sorte que je vais encore avoir une utilisation d'un précis de la minuterie.
  • Si c'est un fait que .Net Minuterie juste "invoque" pour moi, la question est résolue, va avoir à invoquer. Je vais aussi essayer la solution ci-dessous qui a obtenu le plus de votes.

InformationsquelleAutor Istrebitel | 2013-10-21