2010-02-12 22 views
10

Utilizo el siguiente código en un sitio web asp.net.Usando System.Timers.Timer en asp.net

Al iniciar la aplicación, llamo InitializeTimer() una vez.

El objetivo del código era ejecutar DoWork() una vez por hora (1 vez por hora).

También quería que el código se ejecutara en diferentes tiempos cada ciclo, así que agregué la parte aleatoria.

El resultado que obtuve fue werid, no puedo encontrar una explicación de por qué ocurre.

El código que se ejecuta la función después de 2 horas, y luego otra vez después de 2 horas, a continuación, después de 3 horas , a continuación, después de 2 horas y 2 horas de nuevo. ****

¿Alguien puede explicar la razón?

using System.Timers; 
.... 
private static random = new Random(); 
.... 
public static void InitializeTimer() 
{ 
    tTimer = new Timer(); 
    tTimer.AutoReset = true; 
    tTimer.Interval = TimeSpan.FromHours(1.0).TotalMilliseconds; 
    tTimer.Elapsed += new ElapsedEventHandler(ClassName1.tMailer_Elapsed); 
    tTimer.Start(); 
} 

private static void tTimer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    tTimer.Interval += random.Next(-5, 5); 

    DoWork(); 
} 

Actualización:

  1. Favor de no repetir "el servicio de uso de las ventanas", o "tarea programada". Mi pregunta es para el siguiente código No estoy buscando mejores alternativas. Además, durante esta prueba (10 horas), el sitio web tenía mucho tráfico, ¡no se reinició el grupo!

  2. basa en los siguientes MSDN: (http://msdn.microsoft.com/en-us/library/system.timers.timer.interval.aspx)

Si el intervalo se establece después de que el temporizador ha comenzado, el recuento se pone a cero. Para el ejemplo , si establece el intervalo en 5 segundos y luego establece la propiedad Enabled en true, el recuento comienza en cuando se establece Enabled. Si restablece el intervalo a 10 segundos cuando el recuento es 3 segundos, el evento transcurrido es levantado por primera vez 13 segundos después de que Habilitado se estableció en verdadero.

¿Es posible que la causa del problema sea volver a establecer el intervalo en la función transcurrida?

Lo que significa que cuando se llama a la función tTimer_Elapsed, el recuento es 1hr (mínimo unos milisegundos) y mi código "tTimer.Interval + = random.Next (-5, 5);" está agregando otra hora completa al Intervalo?

+0

Si saca la parte aleatoria, ¿funciona el código como se esperaba? – mpeterson

+0

no sé, el código se está ejecutando en el servidor de producción, no puedo cambiarlo ahora (no lo haré por unos días), por eso hice la pregunta para encontrar una explicación. – RuSh

+0

¿Significa eso que funciona según lo esperado cuando se prueba localmente? – mpeterson

Respuesta

4

Compruebe this fuera ... Jeff Atwood en realidad discutió algo similar. Supongo que funcionó, pero según Jeff, el sitio superó este método, por lo que se dedicaron a una tarea específica.

5

Las aplicaciones ASP.NET se apagarán cuando no estén en uso. Si alguien visita tu sitio, y luego no más visitas, se puede cerrar. Tu temporizador no disparará.

Para este tipo de trabajo de mantenimiento, desea utilizar una tarea programada de Windows o un servicio de Windows.

+0

thx para la entrada. el sitio web o el grupo iis NO se reiniciaron durante la prueba. Creo que algo está mal con mi código. – RuSh

+0

@sharru IIS recicla su aplicación sin la intervención del usuario. –

+1

estoy al tanto de eso, registro esos eventos, no se reinicio. – RuSh

1

Sugiero la sugerencia de Sams de usar la tarea programada de Windows para acceder a una página cada hora. Intenté e intenté que el mío funcionara y funcionó. Fui a una tarea programada y nunca ha fallado.

1

Desde .NET 4.5.2, hay una clase llamada HostingEnvironment, que puede hacer lo que estás pidiendo, aquí es cómo utilizar: https://blog.mariusschulz.com/2014/05/07/scheduling-background-jobs-from-an-asp-net-application-in-net-4-5-2

El método HostingEnvironment.QueueBackgroundWorkItem que permite horario pequeños elementos de trabajo de fondo. ASP.NET realiza un seguimiento de estos elementos y impide que IIS finalice abruptamente el proceso de trabajo hasta que se completen todos los elementos de trabajo de fondo .

Cuestiones relacionadas