He estado revisando algunas de las posibles temporizadores últimamente, y System.Threading.Timery System.Timers.Timerson 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.Timerel artículo de MSDN de MSDN , es perfectamente seguro para subprocesos ...System.Threading.Timeres tan "irónicamente" no seguro para subprocesos comoSystem.Threading.Threadlos subprocesos obtenidos a través del conjunto. El hecho de que estas clases no le den la mano y administren el uso de lalockpalabra clave en sí no significa que estas clases no sean seguras para subprocesos. También podría decirSystem.Threading.Threadque no es seguro para subprocesos, porque es exactamente igual de cierto.SynchronizingObjectno 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.Timerobjeto está específicamente documentado como seguro para subprocesos.System.Threading.TimerEs un simple temporizador. Le devuelve la llamada a un subproceso de grupo de subprocesos (del grupo de trabajo).System.Timers.Timeres unSystem.ComponentModel.Componentque envuelve unSystem.Threading.Timer, y proporciona algunas características adicionales utilizadas para el envío en un hilo particular.System.Windows.Forms.Timeren 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.Timeres 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.TimerutilizaSystem.Threading.Timerinternamente. Ver código fuente .En su libro " CLR Via C # ", Jeff Ritcher desalienta el uso de
System.Timers.Timereste 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.Timerpara tareas en segundo plano en un subproceso de grupo de subprocesos.fuente
System.Threading.Timeres 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.Timerfue 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.Timeren su lugar.Parece que Microsoft favorece
System.Threading.TimerantesSystem.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.Timersilenciosamente traga excepciones, mientrasSystem.Threading.Timerque no.Por ejemplo:
vs
fuente
Encontré una breve comparación de MSDN
fuente
Las dos clases son funcionalmente equivalentes, excepto que
System.Timers.Timertiene 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.Timera 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.Timeres 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.Timeres 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