Wie soll ich eine lang andauernde Aufgabe in ASP.NET 4 ausführen?

8

Ich baue eine Website mit .NET 4. Es gibt viele MSDN-Artikel aus 2003, über die Verwendung von Thread-Objekten und 2007 unter Verwendung von asynchronen Seiten in .NET 2 >, aber das ist alles ziemlich schal. Ich weiß, .NET 4 brachte uns die Task-Klasse und einige Leute warnen vage davor, es zu diesem Zweck zu benutzen .

Also frage ich Sie, was ist die "bevorzugte" Methode circa 2011 für Hintergrund / asynchrone Arbeit unter IIS in ASP.NET 4 ausführen? Welche Vorbehalte gibt es bei der direkten Verwendung von Thread / Task? Ist Async = true noch in Mode?

EDIT: Ok, ok, aus den Antworten ist klar, die Meinung ist, dass ich einen Service machen sollte, wenn ich kann. Aber die Vorteile, die es innerhalb der Webanwendung zu tun hat, sind signifikant, insbesondere eine einfachere Bereitstellung / erneute Bereitstellung. Angenommen, der Prozess ist absturzsicher, und wenn ich es innerhalb von IIS tun sollte, was ist der beste Weg?

    
Scott Stafford 05.04.2011, 13:54
quelle

5 Antworten

15

Vermeiden Sie lange Aufgaben in einer solchen Umgebung.

Delegieren Sie lange laufende Aufgaben über Interoperabilität zu einem stabilen Systemdienst, lassen Sie die Webanwendung reagieren und nur für direkte Benutzeranforderungen erforderlich.

Webanwendungen wurden (und werden) immer noch nicht als zuverlässige Systeme betrachtet - jeder, der jemals einen Browser verwendet hat, hat (zumindest) eine Auszeit gefunden, um sicher zu sein; und solche Unannehmlichkeiten (für beide Parteien) sind nicht auf dieses Szenario beschränkt. Natürlich kann jedes System abstürzen, aber die Umstände, die ein solches Ereignis auf einem verbauten System umgeben, sollten vollkommen außergewöhnlich sein.

Windows-Dienste sind so konzipiert, dass sie lange laufen, und wenn etwas schief geht, müssen Sie sich mehr Sorgen machen als Ihr individueller Dienst.

    
Grant Thomas 05.04.2011 13:58
quelle
1

Es ist am besten, vermieden zu werden, aber wenn Sie dazu gezwungen werden, denken Sie an Hanselmans Gedanken bei Wie Sie Hintergrundaufgaben in ASP ausführen. NET .

Unter ihnen, und für etwas schnell und einfach, würde ich vorschlagen, dass Sie insbesondere auf die Aus eigener Erfahrung schneidet Task nicht ab. QueueBackgroundWorkItem ist viel besser.

    
Tim Cooke 12.11.2015 23:55
quelle
0

Sie können einen statischen ThreadPool wie diesen Ссылка mit begrenzter Thread-Nummer erstellen (zum Beispiel nur 2). und dann Aufgaben darin einreihen, aber dies ist sehr zu empfehlen, da Webserver nicht für solche Aufgaben geeignet sind

    
Troydm 05.04.2011 14:02
quelle
0

Meine bevorzugte Methode ist die gleiche wie Robert Harvey in seiner Antwort vorschlägt.

Sie können weiterhin die Task Parallel Library verwenden, die Aufgabe jedoch in einer separaten Task zusammenfassen Prozess außerhalb von IIS (der Grund dafür ist, dass IIS eine begrenzte Anzahl von Worker-Threads zur Verteilung hat und andere Einschränkungen auferlegt, die lang laufende Aufgaben unvorhersehbar machen können).

    
Justin Niessner 05.04.2011 13:59
quelle
0

Dies ist eine Beschreibung eines 'einmal am Tag' Szenarios.

Wenn Sie wirklich vermeiden möchten, einen Dienst zu erstellen, könnten Sie einen Timer mit 1-Minuten-Intervallen starten. Jedes Mal, wenn der Timerdelegat aufgerufen wird, müssen Sie etwas wie diesen (Pseudocode) ausführen:

%Vor%

Beachten Sie, dass der lastInvokeDay entweder in der Datenbank oder in einer Datei persistent sein sollte ...

Wenn Sie jetzt den sofortigen Aufruf der Aufgabe aktivieren möchten, können Sie einfach runMyTask() bei Bedarf aufrufen. Wenn es wichtig ist, dass runMyTask nicht mehr als einmal am Tag auftritt, können Sie einen syncronisierten Code-Block darin erstellen (mit einer lock -Anweisung) und den lastInvokeDay -Check nach innen verschieben.

Beantwortet das Ihre Frage?

    
Uri Abramson 02.07.2013 08:13
quelle