2012-11-30 12 views
5

Zum Beispiel möchte ich eine Funktion in bestimmten Zeitintervallen aufrufen (stündliche oder tägliche Aufgaben).Sich wiederholende Aufgaben in bestimmten Zeitintervallen?

Ich verwende bereits Timer. Aber es funktioniert, solange mein lokaler Server funktioniert. Zum Beispiel:

public static void StartYahooWeatherManager() 
{ 
    Timer t = new Timer(1000 * 60 * 60 * 6 /* 6 hours */); 
    t.Elapsed += new ElapsedEventHandler(WriteYahoWeatherRssItemToDb); 
    t.Start(); 
} 

private static void WriteYahoWeatherRssItemToDb(object o, ElapsedEventArgs e) 
{ 
    YahooWeatherManager.InsertYahooWeatherRssItem(YahooWeatherManager.GetYahooWeatherRssItem()); 
} 

Ich schreibe Wetterinformationen zu db, in 6 Stunden Intervallen. Das Projekt befindet sich bereits im Host. Das Timer-Ereignis funktioniert so lange, wie mein lokaler Computerserver läuft.

Frage:

Was ist falsch über meinen Code? (Oder ist es falsch, den Timer in WebProject zu verwenden?) Warum funktioniert der Timer nur, während der lokale Server funktioniert?

Was ist der beste Weg, Zeitintervall Aufgaben zu verwalten? (nicht brauchen asp.net)

Ich hoffe, ich kann das Problem erklären. Vielen Dank.

+0

Müssen Sie das wirklich in einer ASP.NET-Anwendung tun? Haben Sie überlegt, einen Windows-Dienst zu erstellen? –

+0

@RuiJarimba, Keine Notwendigkeit, Auch ich fragte das auch. 'Was ist der beste Weg, Zeitintervall Aufgaben zu verwalten?'. Entschuldigung, ich habe die Frage aktualisiert. –

Antwort

7

Der Grund, warum der Timer stoppt, weil dieser Timer in Ihrer ASP.NET-Anwendung ausgeführt wird, die sich auf einem Webserver gehostet wird. Wenn dieser Server die Anwendung stoppt oder wiederverwendet, wird die AppDomain mit allen Threads heruntergefahren, die Sie möglicherweise gestartet haben. Daher ist es eine sehr schlechte Idee, wiederkehrende Hintergrundaufgaben in einer ASP.NET-Anwendung zu schreiben. Phil Haack blogged about the dangers.

Der richtige Weg, dies zu tun ist, diesen Code in einem separaten Prozess außerhalb Ihrer ASP.NET-Anwendung hosten. Dies könnte ein Windows-Dienst oder eine Konsolenanwendung sein, die in regelmäßigen Abständen ausgeführt wird, beispielsweise unter Verwendung des Windows-Schedulers. Auf diese Weise wird garantiert, dass der Code immer ausgeführt wird.

2

Mein Vorschlag ist, einen Windows-Dienst zu erstellen, der einen Zeitgeber verwendet, oder erstellen Sie eine normale Anwendung, und erstellen Sie eine geplante Aufgabe, um es in dem Intervall auszuführen, das Sie benötigen. Dieser Beitrag kann Stackoverflow Ihnen helfen:

Windows service and timer

+0

+1. Danke vielmals... –

0

Sie können das Recycling für den Anwendungspool deaktivieren, zu dem Ihre asp.net-App gehört. Speicherlecks sind selten für .Net, so dass Sie sich meistens auf GC verlassen können. Dies wird auch das Aufwärmen nach dem Recycling entfernen und die Benutzererfahrung mit fast keiner Anstrengung verbessern.

Die andere gute Lösung ist, Konsolenanwendung zu erstellen und in Windows "Task Scheduler" zu planen. Sie werden schöne haben, um zu verwalten wann und wie zu laufen. Es ist viel einfacher, solche Aufgaben als "Windows Service" zu verwalten und erfordert weniger Code zu schreiben.

Verwandte Themen