none
Qué opinan ¿Qué es más eficiente para ejecutar una tarea repetitiva? (explico) RRS feed

  • Pregunta

  • (En una aplicación tipo Windows Form).

    Suponiendo que queremos ejecutar una tarea indefinidamente. Por ejemplo, consultar constantemente si una determinada ventana (en Windows) está abierta.

    ¿Es más recomendable usar un control Timer o usar un hilo con un bucle infinito?, ¿o, en este caso, las dos tienen igual impacto?

    lunes, 18 de marzo de 2019 2:06

Respuestas

  • Hay una diferencia: En una aplicación de Windows Forms, el Timer solo se dispara cuando la aplicación no está "ocupada". Esto significa que si la aplicación está, por ejemplo, ejecutando un bucle que procesa datos, el Timer no se dispara hasta que todo ese procesamiento termina. Una forma de evitarlo es usar un System.Threading.Timer en lugar del System.Windows.Forms.Timer. En este caso, es completamente equivalente a un hilo con un bucle infinito que tenga dentro una llamada a Thread.Sleep.

    Ojo en el caso de usar un hilo (tanto si es un hilo con un bucle como si es un System.Threading.Timer, que internamente dispara los eventos en otro hilo). Hay que aplicar las precauciones habituales cuando se programa en multihilo, especialmente tener en cuenta que el hilo no puede acceder a ninguno de los componentes de la interfaz de usuario. Se puede usar una llamada a Control.Invoke para pasar al hilo principal cuando se necesite acceder a la interfaz, pero esa llamada está sujeta a las mismas limitaciones que mencionamos antes para el System.Windows.Forms.Timer, es decir, se queda bloqueada si el hilo principal está ocupado ejecutando algo.

    • Propuesto como respuesta Javi Fernández F lunes, 18 de marzo de 2019 14:05
    • Marcado como respuesta James2016-2 lunes, 18 de marzo de 2019 20:13
    lunes, 18 de marzo de 2019 7:32

Todas las respuestas

  • Hay una diferencia: En una aplicación de Windows Forms, el Timer solo se dispara cuando la aplicación no está "ocupada". Esto significa que si la aplicación está, por ejemplo, ejecutando un bucle que procesa datos, el Timer no se dispara hasta que todo ese procesamiento termina. Una forma de evitarlo es usar un System.Threading.Timer en lugar del System.Windows.Forms.Timer. En este caso, es completamente equivalente a un hilo con un bucle infinito que tenga dentro una llamada a Thread.Sleep.

    Ojo en el caso de usar un hilo (tanto si es un hilo con un bucle como si es un System.Threading.Timer, que internamente dispara los eventos en otro hilo). Hay que aplicar las precauciones habituales cuando se programa en multihilo, especialmente tener en cuenta que el hilo no puede acceder a ninguno de los componentes de la interfaz de usuario. Se puede usar una llamada a Control.Invoke para pasar al hilo principal cuando se necesite acceder a la interfaz, pero esa llamada está sujeta a las mismas limitaciones que mencionamos antes para el System.Windows.Forms.Timer, es decir, se queda bloqueada si el hilo principal está ocupado ejecutando algo.

    • Propuesto como respuesta Javi Fernández F lunes, 18 de marzo de 2019 14:05
    • Marcado como respuesta James2016-2 lunes, 18 de marzo de 2019 20:13
    lunes, 18 de marzo de 2019 7:32
  • Ah, ok. Muchas gracias por la explicación.
    lunes, 18 de marzo de 2019 20:13