2010-10-14 18 views
7

¿Cuánto sobrecarga causan los temporizadores en una aplicación si se ejecutan continuamente en segundo plano (independientemente del intervalo)?Sobrecarga del temporizador en la aplicación C#

No me preocupan las llamadas que hará el temporizador cuando funciona, sino más bien los efectos de rendimiento del uso de temporizadores en aplicaciones donde el rendimiento es de suma importancia y estoy interesado en escuchar qué puntos de vista hay en este .

+0

Hay veces en .net http://msdn.microsoft.com/en-us/magazine/cc164015.aspx ¿de qué estás hablando? – Andrey

+0

Bueno, me refería a los temporizadores en general, pero la aplicación actual en la que estaba más preocupado es una aplicación de Silverlight, así que utilizaría DispatcherTimer. Gracias – Madeleine

Respuesta

8

El temporizador, entre sus marcas, agrega un costo extremadamente bajo para la aplicación. Utiliza el mecanismo del sistema operativo para la programación (que está activo independientemente de sus acciones), a diferencia del concepto intuitivo de sondear el reloj del sistema constantemente.

Básicamente, aparte de la adición de datos adicionales de memoria y contexto (adiciones menores en este caso. No debería ser más que agregar un botón a su formulario) no debería haber más gastos generales.

+1

Cuando se trata de temporizadores y subprocesos, "agrupar" y "sondear" son dos palabras diferentes que uno debe tener cuidado de deletrear correctamente;) – d7samurai

+0

¡Vaya! Mi error. Gracias, @ d7samurai. – Neowizard

+0

El "Mecanismo de programación del SO" que menciona se llama un [** ciclo de mensajes **] (https://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows) que pone en cola los mensajes. La aplicación tiene un bucle de eventos que recibe mensajes de esa cola de mensajes. – BornToCode

0

El evento invocado por el temporizador se ejecutará en el mismo subproceso al que pertenece el temporizador y, por lo tanto, bloqueará ese subproceso al realizar cualquier lógica. Eso significa que si el temporizador pertenece a la capa de la GUI, la ejecución del método Timer.Tick bloqueará la GUI mientras se está ejecutando.

Para mantener el rendimiento en el hilo principal, sugiero usar un BackgroundWorker que se ejecuta en su propio hilo.

+0

Hay veces en .net http://msdn.microsoft.com/en-us/magazine/cc164015.aspx ¿de qué estás hablando? – Andrey

+0

Me refería a System.Windows.Forms.Timer con mi declaración anterior. –

0

Para responder de la misma manera: los temporizadores son muy valiosos para la programación de la interfaz gráfica de usuario, pero son bastante inútiles para las tareas de alto rendimiento. Algunos problemas con temporizadores:

  • que no son regulares a la milésima de segundo (de hecho, en las ventanas, no hay nada) - que se disparará cuando es su tiempo, pero cuando todos los otros mensajes (eventos de ratón-teclado, control de cambios) son procesados, ya que es de serie con otros mensajes desde/en Gui
  • no saben aplicación .NET, pero no perdieron mangos en MFC

Si está pensando en otro hilo por alguna operación, asegúrese que no tocas ningún componente GUI de ella. Use Invoke() o copie las actualizaciones de una interfaz gráfica de usuario a alguna cola, luego desógúela con el temporizador de la secuencia principal de la interfaz gráfica de usuario.