He estado revisando algunas de las posibles temporizadores últimamente, y System.Threading.Timer
y System.Timers.Timer
son las que se ven necesaria para mí (ya que el apoyo conjunto de hilos).
Estoy haciendo un juego y planeo usar todo tipo de eventos, con diferentes intervalos, etc.
¿Cuál sería el mejor?
Threading.Timer
el artículo de MSDN de MSDN , es perfectamente seguro para subprocesos ...System.Threading.Timer
es tan "irónicamente" no seguro para subprocesos comoSystem.Threading.Thread
los subprocesos obtenidos a través del conjunto. El hecho de que estas clases no le den la mano y administren el uso de lalock
palabra clave en sí no significa que estas clases no sean seguras para subprocesos. También podría decirSystem.Threading.Thread
que no es seguro para subprocesos, porque es exactamente igual de cierto.SynchronizingObject
no hace que el objeto del temporizador sea seguro para subprocesos. Solo se asegura de que su código para manejar el evento del temporizador se llame en un hilo específico (si configura esa propiedad adecuadamente). No se garantiza que el objeto del temporizador sea seguro para subprocesos, como se indica claramente en la documentación. Por otro lado, elSystem.Threading.Timer
objeto está específicamente documentado como seguro para subprocesos.System.Threading.Timer
Es un simple temporizador. Le devuelve la llamada a un subproceso de grupo de subprocesos (del grupo de trabajo).System.Timers.Timer
es unSystem.ComponentModel.Component
que envuelve unSystem.Threading.Timer
, y proporciona algunas características adicionales utilizadas para el envío en un hilo particular.System.Windows.Forms.Timer
en su lugar, envuelve un mensaje nativo solo HWND y usa temporizadores de ventana para generar eventos en ese bucle de mensajes HWND.Si su aplicación no tiene interfaz de usuario y desea el temporizador .Net más liviano y de uso general posible (porque está contento de descubrir su propio enhebrado / despacho), entonces
System.Threading.Timer
es tan bueno como se obtiene en el marco.No estoy completamente claro cuáles son los supuestos problemas de 'no es seguro para subprocesos'
System.Threading.Timer
. Quizás sea lo mismo que se hizo en esta pregunta: Seguridad de subprocesos de System.Timers.Timer vs System.Threading.Timer , o tal vez todo el mundo solo quiere decir que:es fácil escribir las condiciones de carrera cuando usas temporizadores. Por ejemplo, vea esta pregunta: Seguridad del hilo del temporizador (System.Threading)
reencuentro de notificaciones de temporizador, donde su evento de temporizador puede activarse y devolverle la llamada por segunda vez antes de que termine de procesar el primer evento. Por ejemplo, vea esta pregunta: Ejecución segura para subprocesos utilizando System.Threading.Timer y Monitor
fuente
System.Timers.Timer
utilizaSystem.Threading.Timer
internamente. Ver código fuente .En su libro " CLR Via C # ", Jeff Ritcher desalienta el uso de
System.Timers.Timer
este temporizadorSystem.ComponentModel.Component
, lo que permite su uso en la superficie de diseño de Visual Studio. De modo que solo sería útil si desea un temporizador en una superficie de diseño.Prefiere utilizarlo
System.Threading.Timer
para tareas en segundo plano en un subproceso de grupo de subprocesos.fuente
System.Threading.Timer
es similar a usar un grupo de hilos o crear su propio hilo. Por supuesto, estas clases no manejan la sincronización por usted , ¡ese es su trabajo! Ni un subproceso de grupo de subprocesos, su propio subproceso ni una devolución de llamada del temporizador manejarán el bloqueo: en qué objeto y de qué manera y en qué circunstancias necesita bloquear requiere un buen juicio y la versión de subprocesamiento del temporizador le brinda la mayor flexibilidad y granularidadInformación de Microsoft sobre esto (ver Comentarios en MSDN ):
Es interesante mencionar que
System.Timers.Timer
fue obsoleto con .NET Core 1.0, pero se implementó nuevamente en .NET Core 2.0 (/ .NET Standard 2.0). El objetivo con .NET Standard 2.0 era que debería ser lo más fácil posible cambiar de .NET Framework, que probablemente sea la razón por la que regresó.Cuando quedó en desuso, el Complemento de .NET Portability Analyzer Visual Studio recomendó usar
System.Threading.Timer
en su lugar.Parece que Microsoft favorece
System.Threading.Timer
antesSystem.Timers.Timer
.NOTA DE EDICIÓN 15/11/2018: entrego para cambiar mi respuesta ya que la información anterior sobre .NET Core 1.0 ya no era válida.
fuente
Una diferencia importante no mencionada anteriormente que podría atraparte es que
System.Timers.Timer
silenciosamente traga excepciones, mientrasSystem.Threading.Timer
que no.Por ejemplo:
vs
fuente
Encontré una breve comparación de MSDN
fuente
Las dos clases son funcionalmente equivalentes, excepto que
System.Timers.Timer
tiene una opción para invocar todas sus devoluciones de llamada de caducidad del temporizador a través de ISynchronizeInvoke configurando SynchronizingObject . De lo contrario, ambos temporizadores invocan devoluciones de llamada de vencimiento en subprocesos de grupo de subprocesos.Cuando arrastra un objeto
System.Timers.Timer
a una superficie de diseño de formularios Windows Forms, Visual Studio establece SynchronizingObject en el objeto formulario, lo que provoca que todas las devoluciones de llamada de vencimiento se invoquen en el subproceso de la interfaz de usuario.fuente
Desde MSDN:
System.Threading.Timer
es un temporizador simple y liviano que utiliza métodos de devolución de llamada y es atendido por subprocesos de grupo de subprocesos. No se recomienda su uso con Windows Forms, ya que sus devoluciones de llamada no se producen en el hilo de la interfaz de usuario.System.Windows.Forms.Timer
es una mejor opción para usar con Windows Forms. Para la funcionalidad del temporizador basado en el servidor, puede considerar el usoSystem.Timers.Timer
, que genera eventos y tiene características adicionales.Fuente
fuente