Pour un service de fenêtres, ce qui est mieux, une attente de spin ou une minuterie?

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

  •  11-09-2019
  •  | 
  •  

Question

Cette question sur minuteries pour les services Windows a me penser :

Dire que j'ai (et moi) href="http://www.albahari.com/threading/part2.aspx#_Wait_Handles" rel="nofollow un thats service Windows attente sur un WaitHandle et quand réveillé, il plonge dans une attente spin comme je l'ai montré ci-dessous dans un organigramme

attendre diagramme de spin http://www.86th.org/waitspin.jpg

Je suis curieux de savoir si vous utilisez une minuterie serait mieux qu'un attendre spin boucle (parfois appelée spin-attente). Je vais être honnête, je ne l'ai jamais utilisé minuteries pour autre chose que moi-même bricoler.

Je n'ai pas de plans pour passer à moins que les différences sont profondes et les avantages de l'utilisation d'une minuterie sont étonnants. Cependant, je suis très intéressé sur les peuples pensées sur un contre l'autre pour le développement futur de ce projet.

Laissez-moi savoir si cela devrait être un wiki

Était-ce utile?

La solution

Je ne te vois pas obtenir un avantage sur une minuterie. Vous comportez essentiellement comme une minuterie de toute façon avec votre appel de sommeil, et vous n'êtes pas un porc de bande passante car on obtient le sommeil la tranche de temps. Avoir un réveil de la minuterie explicite et vous appelez va juste compliquer le code.

Je ne dirais pas vraiment que vous faites un tour-attente, car je pense généralement d'un spin-attendre que quelque chose qui ne dort pas. Il brûle juste tout qu'il est temps de processeur en attendant le signal de déplacement.

Autres conseils

Dormir un fil et d'attente sur une poignée avec un délai d'attente sont essentiellement la même chose sous les couvertures. Je suppose que les minuteries sont essentiellement mises en œuvre à l'aide de sommeil, donc pas là beaucoup de différence, que ce soit. En d'autres termes, vous pouvez simplifier votre code en attente sur la poignée avec un délai d'attente dans une seule boucle et vérifier pour voir pourquoi l'attente a été libéré (données disponibles ou délai d'attente), plutôt que de mettre en œuvre attente séparées et boucles sommeil. Un peu plus efficace que les boucles indépendantes.

Idéalement, vous ne seriez pas utiliser le sommeil du tout et simplement dépendre du code de génération de données pour augmenter correctement l'événement votre code de la consommation est en attente sur, avec un délai d'attente assez longue pour gérer lorsque la source de l'événement a disparu.

Si les données externes, par exemple sur une prise ou un autre périphérique d'entrée, la poignée peut généralement être configuré pour permettre l'attente de données soient disponibles - pas besoin de sondage dans ce cas, puisque l'événement sera signalé toujours quand les données sont prêtes à la consommation.

Nous utilisons les discussions. Non seulement ils effectuent comme une minuterie, mais ils nous donnent une poignée pour effectuer d'autres opérations pendant que le thread dort.

Je pense que cela dépend vraiment de votre exigence:

  1. Exécuter la tâche tous 5 min (par exemple, 12:00, 12:05, 12:10, ...)
  2. Après avoir terminé la tâche en cours, exécutez la tâche suivante après 5 min.

minuterie semble être facile pour le cas 1 et Thread.Sleep semble être facile pour le cas 2, même si la minuterie et Thread.Sleep peuvent faire les deux d'entre eux.

I, en fait, mettre un commentaire plus (y compris une certaine considération le cas 1) pour une question similaire ( service Windows exécution programmée ).

Polling est mauvaise, et presque toujours évitables. De temps en temps pour des choses futiles, il est moins mauvais que la complexité nécessaire pour l'éviter.

Quelle source êtes-vous vote pour « A données? » que vous ne pouvez pas se transformer en une sorte de poignée attente?

En outre, ne pas Sleep() dans le code sérieux (comme un service) pour une quantité importante de temps. Le blocage que vous pouvez faire est WaitFor[Single|Multiple]Objects(...) où la liste des poignées comprend un événement qui est déclenché quand il est temps d'arrêter le processus. Trouver partout où vous appelez Sleep(millisec) et le remplacer par WaitForSingleObjects(g_shutdownEvent, millisec).

Raymond Chen explique, "Ouais, peu importe." Si vous ne pouvez pas trouver un moyen d'obtenir notifié lorsque vos données est prêt -. alors votre SOL

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top