Digamos que tengo una instancia System.Threading.Timer existente y que me gustaría llamar Cambio en él para empujarlo está disparando tiempo atrás:"atómicamente" cambiar un System.Threading.Timer
var timer = new Timer(DelayCallback, null, 10000, Timeout.Infinite);
// ... (sometime later but before DelayCallback has executed)
timer.Change(20000, Timeout.Infinite);
I Estoy usando este temporizador para realizar una "devolución de llamada inactiva" después de un período sin actividad. ("Inactivo" y "sin actividad" son condiciones definidas por la aplicación en este caso ... los detalles no son terriblemente importantes.) Cada vez que realizo una "acción", quiero reiniciar el temporizador para que siempre esté configurado para disparar 10 segundos después de eso.
Sin embargo, hay una condición de carrera inherente porque cuando llamo a Change, no puedo decir si el temporizador ya se ha disparado en función de su configuración anterior. (Puedo, por supuesto, decir si mi devolución de llamada ha sucedido, pero no puedo decir si el hilo del temporizador interno de CLR ha puesto en cola mi devolución de llamada al hilo y su ejecución es inminente.)
Ahora sé que puedo llamar Eliminar en la instancia del temporizador y volver a crearlo cada vez que necesito "empujarlo hacia atrás". pero este parece menos eficaz que simplemente cambiar el temporizador existente. Por supuesto, puede no ser ... Voy a ejecutar algunos micro-puntos de referencia en un momento y que todos ustedes lo sepan.
Como alternativa, siempre puedo realizar un seguimiento del tiempo de activación esperado (mediante DateTime.Now.AddSeconds (10)) y, si el temporizador original se dispara, ignórelo marcando DateTime.Now en la devolución de llamada. (Tengo una inquietud persistente de que esto puede no ser 100% confiable debido al temporizador usando TimeSpan y mi cheque usando DateTime ... esto puede no ser un problema pero no me siento completamente cómodo con él por alguna razón ...
)Mis preguntas son:
- ¿hay una buena manera para que llame a Timer.Change y ser capaz de saber si me las arreglé para cambiarlo antes de la devolución de llamada se puso en cola a la threadpool? (No lo creo, pero no está de más preguntar ...)
- ¿Alguien más ha implementado (lo que yo denomino) un "temporizador de retroceso" como este? Si es así, me encantaría saber cómo resolvió el problema.
Esta pregunta es de naturaleza hipotética ya que ya tengo un par de soluciones de trabajo (basadas en Dispose y basadas en DateTime.Now) ... Estoy interesado principalmente en escuchar sugerencias relacionadas con el rendimiento (como yo "presionaré" el temporizador MUY frecuentemente).
Gracias!