2010-02-12 12 views
10

Ich verwende den folgenden Code in einer asp.net-Website.Verwenden von System.Timers.Timer in asp.net

Auf Anwendung Init rufe ich InitializeTimer() einmal auf.

Das Ziel des Codes war, DoWork() einmal pro Stunde (1 Mal pro Stunde) auszuführen.

Ich wollte auch, dass der Code zu verschiedenen Zeiten jede Schleife ausgeführt, so dass ich den zufälligen Teil hinzugefügt.

Das Ergebnis, das ich bekam, war ich, ich kann keine Erklärung finden, warum passiert.

Der Code ausgeführt, um die Funktion nach 2 Stunden, dann wieder nach 2 Stunden, dann nach 3hrs, dann nach 2 Stunden und 2 Stunden wieder. ****

Kann jemand den Grund erklären?

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(); 
} 

Update:

  1. Bitte schreiben Sie keine "Verwendung Windows-Dienst" oder "geplante Aufgabe". Meine Frage ist für den folgenden Code Ich bin nicht auf der Suche nach besseren Alternativen. Auch während dieses Tests (10 Stunden), war die Website mit hohem Traffic, IIS Pool nicht neu gestartet!

  2. auf der folgenden MSDN Basierend: (http://msdn.microsoft.com/en-us/library/system.timers.timer.interval.aspx)

Wenn das Intervall, nachdem der Zeitgeber gestartet wurde gesetzt ist, wird der Zählwert zurückgesetzt wird. Wenn Sie beispielsweise für das Intervall auf 5 Sekunden setzen und dann die Eigenschaft Enabled auf true setzen, beginnt die Zählung bei , wenn die Zeit Enabled gesetzt ist. Wenn Sie das Intervall auf 10 Sekunden zurücksetzen, wenn die Zählung 3 Sekunden beträgt, wird das Elapsed-Ereignis zum ersten Mal 13 Sekunden lang ausgelöst , nachdem Enabled auf True gesetzt wurde.

Ist es möglich, dass das Zurücksetzen des Intervalls in der verstrichenen Funktion die Ursache des Problems ist?

Das heißt, wenn die timer_Elapsed-Funktion aufgerufen wird, ist die Zählung 1hr (min ein paar Millisekunden) und mein Code "tTimer.Interval + = random.Next (-5, 5);" fügt dem Interval eine weitere volle Stunde hinzu?

+0

Wenn Sie den zufälligen Teil herausnehmen, funktioniert der Code wie erwartet? – mpeterson

+0

Ich weiß nicht, der Code läuft auf Production Server, ich kann es jetzt nicht ändern (ein nicht für ein paar Tage), deshalb fragte ich die Frage, um eine Erklärung zu finden. – RuSh

+0

Also bedeutet das, dass es beim lokalen Testen wie erwartet funktioniert? – mpeterson

Antwort

4

Überprüfen Sie this out ... Jeff Atwood diskutiert tatsächlich etwas ähnliches. Ich denke, es hat geklappt, aber laut Jeff überstieg die Seite diese Methode, also gingen sie zu einer bestimmten Aufgabe.

5

ASP.NET-Anwendungen werden heruntergefahren, wenn sie nicht verwendet werden. Wenn jemand Ihre Website schlägt und dann keine weiteren Treffer mehr, kann es heruntergefahren werden. Ihr Timer wird nicht ausgelöst.

Für diese Art von Wartungsarbeiten möchten Sie einen geplanten Windows-Task oder Windows-Dienst verwenden.

+0

thx für den Eingang. Die Website oder der IIS-Pool wurde während des Tests NICHT neu gestartet. Ich glaube, dass etwas mit meinem Code nicht stimmt. – RuSh

+0

@sharru IIS recycelt Ihre Anwendung ohne Benutzereingriff. –

+1

ich bewusst, dass ich diese Ereignisse protokollieren, kein Neustart passiert ist. – RuSh

1

Ich zweite Sams Vorschlag der Verwendung Windows geplanten Aufgabe, um eine Seite jede Stunde zu treffen. Ich habe versucht und versucht, meins zur Arbeit zu bringen, und es hat irgendwie funktioniert. Ich ging zu einer geplanten Aufgabe und es ist nie gescheitert.

1

Seit .net 4.5.2 gibt es eine Klasse namens HostingEnvironment, kann es tun, was Sie fragen, ist hier, wie man verwendet: https://blog.mariusschulz.com/2014/05/07/scheduling-background-jobs-from-an-asp-net-application-in-net-4-5-2

Die HostingEnvironment.QueueBackgroundWorkItem Methode können Sie Zeitplan kleine Hintergrundarbeitselemente. ASP.NET verfolgt diese Elemente, und verhindert, dass IIS den Arbeitsprozess abrupt beendet, bis alle Hintergrundarbeitselemente abgeschlossen sind.

Verwandte Themen