Pregunta

Esta pregunta temporizadores para servicios de Windows me hizo pensar :

Decir que tengo (y yo) a eso de servicios de Windows que esperan en un WaitHandle y cuando se despiertan, se sumerge en una espera de giro como he mostrado a continuación en un diagrama de flujo

esperar diagrama de giro http://www.86th.org/waitspin.jpg

Estoy ansioso por ver si el uso de un contador de tiempo sería mejor que un esperar-spin bucle (a veces llamado un spin-espera). Voy a ser honesto, nunca he utilizado temporizadores para otra cosa que mi propia retoques.

No tengo ningún plan para cambiar a menos que las diferencias son profundas y los beneficios de usar un temporizador son increíbles. Sin embargo, estoy muy interesado en los pensamientos de la gente en un frente al otro para el desarrollo futuro de este proyecto.

Quiero saber si esto debería ser un wiki

¿Fue útil?

Solución

No veo que obtener ningún beneficio de un temporizador. Se están comportando esencialmente como un contador de tiempo de todos modos con su llamada del sueño, y usted no está siendo un cerdo de ancho de banda desde el sueño rinde hasta la porción de tiempo. Tener una estela temporizador explícita y llame sólo va a complicar el código.

No me realmente decir que usted está haciendo un spin-esperar, ya que por lo general pienso en un spin-esperar como algo que no duerme. Sólo se quema todo lo que es tiempo de procesador a la espera de la señal de marcha.

Otros consejos

Sleeping un hilo y esperando en un mango con un tiempo de espera son básicamente la misma cosa bajo las sábanas. Me imagino que los temporizadores se implementan usando esencialmente el sueño, así que no hay mucha diferencia, tampoco. En otras palabras, se puede simplificar el código de espera en el mango con un tiempo de espera en un solo bucle y comprobación para ver por qué la espera fue liberado (datos disponibles o sobre tiempo), en lugar de aplicar bucles de espera y dormitorio independientes. Un poco más eficiente que los bucles independientes.

Lo ideal es que no se usará el sueño en absoluto y sólo dependerá de la generación de código de datos para levantar correctamente el caso de que su código de consumo está esperando, con un tiempo de espera bastante larga de manejar cuando el origen del evento se ha ido.

Si los datos es externo, tal como en un socket u otro dispositivo de entrada, a continuación, el mango puede generalmente estar configurado para permitir la espera de los datos de que se disponga de - no hay necesidad para sondear en ese caso ya que el evento siempre será señalado cuando los datos están listos para el consumo.

Utilizamos hilos. No sólo funcionan como un contador de tiempo, pero que nos dan un asa para llevar a cabo otras operaciones mientras el hilo está durmiendo.

Creo que realmente depende de sus necesidades:

  1. Ejecutar la tarea todos 5 minutos (por ejemplo, 12:00, 12:05, 12:10, ...)
  2. Al completar la tarea actual, ejecute la siguiente tarea después 5 min.

Temporizador parece ser fácil para el caso 1 y Thread.Sleep parece ser fácil para el caso 2, a pesar de temporizador y Thread.Sleep pueden hacer ambos.

Yo, de hecho, puse un comentario más largo (incluyendo algunas consideraciones sobre el caso 1) para una pregunta similar ( Windows servicio programado la ejecución ).

El sondeo es malo, y casi siempre se puede evitar. De vez en cuando por cosas triviales que es menos malo que la complejidad necesaria para evitarlo.

¿Qué son fuente de votación para que "tiene datos?" que no se puede convertir en una especie de espera mango?

Además, no Sleep() en el código grave (como un servicio) para cualquier cantidad significativa de tiempo. El único bloqueo que puede hacer es WaitFor[Single|Multiple]Objects(...) donde la lista de identificadores incluye un evento que se dispara cuando es el momento de cerrar el proceso. Encuentra todas partes que está llamando Sleep(millisec) y reemplazarlo con WaitForSingleObjects(g_shutdownEvent, millisec).

Como explica Raymond Chen, "Sí, lo que sea." Si no puede encontrar una manera de conseguir notificó cuando los datos están listos -. entonces su SOL

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top