2008-09-22 8 views
1

diesen Code Betrachten ...ASP.NET und Timer

using System.Threading; 
//... 
Timer someWork = new Timer(
    delegate(object state) { 
     //Do some work here... 
    }, 
    null, 0, 60000); 

HttpContext.Current.Application["SomeWorkItem"] = someWork; 

Könnte dies gefährlich sein? Zwischenspeichern eines Timers in der Anwendung, um während der Ausführung der Site einige Arbeiten im Hintergrund auszuführen, scheint sicher zu sein, aber ich habe mich gefragt, ob jemand Erfahrung damit hat.

Ich bin sicher, dass das Schreiben eines Dienstes im Hintergrund sicherlich viel besser wäre, aber manchmal ist das nicht immer eine Option. Ist das eine Alternative?

Antwort

3

Dies würde generell eine schlechte Idee sein, da System.Threading.Timer Threads aus dem Threadpool verwendet, die gleichen wie ASP.Net.

Wenn aus irgendeinem Grund Ihre Timer-Delegierten blockiert oder stoppt, wird der Timer einfach einen neuen Thread nach der Zeitüberschreitung beginnen, die auf die Threads für ASP.net auffressen.

Wenn sie alle blockieren beginnen, effektiv werden Sie nicht in der Lage sein, noch mehr Web-Anfragen zu bedienen (wahrscheinlich eine schlechte Sache)

3

Das Problem dabei ist, dass Sie nicht garantieren, dass der Prozess noch am Leben ist. IIS wird den Prozess grundsätzlich zurückfordern, wann immer es sich anfühlt, so dass Sie das Risiko eingehen, dass es nicht ausgeführt wird.

Wenn Sie diese Arbeit erledigt haben, dann müssen Sie es entweder in einen Web-Aufruf einprogrammieren oder einen Dienst im Hintergrund des Servers ausführen lassen.

1

Das wäre gefährlich, da es Zeiten geben kann, in denen der Worker-Prozess recycelt wird oder die AppDomain abstürzt und das Work Item gelöscht wird und Sie möglicherweise wiederherstellen möchten, was es tun könnte.

Ein Windows-Dienst ist möglicherweise in Ordnung, wenn Sie dieses Arbeitselement in einem Dienst bereitstellen können. Wenn ein HttpContext für die Arbeit benötigt wird, möchten Sie vielleicht, dass ein Windows-Dienst einen Webservice aufruft, um den Aufruf in regelmäßigen Abständen auszuführen, was wahrscheinlich nicht optimal funktioniert.

0

Das macht Sinn, aber nur zum Spaß, was ist, wenn die Arbeit nicht ausgeführt werden muss, wenn die Website heruntergefahren wird? Wenn es mit dem Application_Start-Ereignis verknüpft ist und nur ausgeführt werden muss, während Benutzer die Website durchsuchen, welche Risiken bestehen zu diesem Zeitpunkt?

Gute Antworten, ich bin nur ein bisschen mehr darüber neugierig, wie das auf der Innenseite funktioniert.

0

Ich würde empfehlen, eine geplante Aufgabe einzurichten, um eine Seite auf Ihrer Website auszuführen. I-Punkt in der Regel die geplante Aufgabe eine VBS-Datei mit folgendem:

 
On Error Resume Next 
Dim objRequest 
Dim URL 

Set objRequest = CreateObject("Microsoft.XMLHTTP") 
URL = "http://www.mywebsite.com/cron/pagetorun.ashx" 

objRequest.open "POST", URL , false 

objRequest.Send 

Set objRequest = Nothing