Welche Art von Multi-Thread-Probleme müssen Sie in asp.net vorsichtig sein?Multithreading in asp.net
Antwort
Programmatic Caching ist ein Bereich, der mir sofort in den Sinn kommt. Es ist ein großartiges Feature, das sorgfältig verwendet werden muss. Da es für alle Anfragen freigegeben ist, müssen Sie vor dem Aktualisieren Sperren einrichten.
Ein anderer Ort, den ich überprüfen würde, ist Code, der auf Dateisystem zugreift, wie das Schreiben in Protokolldateien. Wenn eine Anforderung eine Lese-/Schreibsperre für eine Datei hat, werden andere gleichzeitige Anforderungen fehlgeschlagen, wenn sie nicht ordnungsgemäß verarbeitet werden.
Eine Sache, auf die Dinge zu achten, die ablaufen (ich denke, httpContext tut), wenn Sie es für Operationen verwenden, die "Feuer und vergessen" sind, erinnern Sie sich plötzlich, wenn der ASP.net Bereinigungscode zuvor ausgeführt wird Wenn Ihre Operation abgeschlossen ist, können Sie nicht auf bestimmte Informationen zugreifen.
Wenn dies für einen Webdienst ist, sollten Sie Threadpooling in Betracht ziehen. Zu viele Threads bringen Ihre Anwendung zum Erliegen, weil sie irgendwann um die CPU-Zeit konkurrieren werden.
Ist dies für Datei oder Netzwerk IO? Wenn ja, sollten Sie auch die Verwendung von asynchronous IO in Erwägung ziehen. Es kann etwas mühsamer zu programmieren sein, aber Sie müssen sich keine Sorgen machen, dass zu viele Threads auf einmal erstellt werden.
Es ist riskant, Threads aus dem Code-Behind einer ASP.NET-Seite zu generieren, da der Worker-Prozess gelegentlich wiederverwendet wird und Ihr Thread abstürzt.
Wenn Sie lang andauernde Prozesse als Folge von Benutzeraktionen auf Webseiten starten müssen, sollten Sie eine Nachricht in MSMQ ablegen und einen separaten Hintergrunddienst verwenden, der die Warteschlange überwacht. Der Dienst könnte so lange dauern, wie er die Aufgabe erfüllen möchte, und die Webseite wäre fast sofort mit ihrer Arbeit fertig. Sie können dasselbe mit einem asynchronen Aufruf einer Webmethode erreichen, sind aber nicht darauf angewiesen, die Antwort zu erhalten, wenn die Webmethode fertig ist. Von Code-Behind muss es ein schnelles Feuer-und-Vergessen sein.
Sie scheinen diese Technik in mehreren Fragen zu StackOverflow zu befürworten, und ich denke, dass dies der Weg ist, den Sie für einen langwierigen Prozess, wie z. Gibt es Beispielcode, den Sie freigeben können? oder ein Keyword zu binged? – Salamander2007
Es gibt viele Frameworks zum Ausführen von Hintergrundprozessen, die viel einfacher zu verwenden sind, als dies alles mit MSMQ zu implementieren. Zum Beispiel • Quartz.NET und HangFire. Wenn Sie mit einer Einschränkung von 90 Sekunden leben können, können Sie sogar QueueBackgroundWorkItem verwenden. Wenn Sie auf Azure, Web Jobs oder Cloud-Services zugreifen. – RickAndMSFT
Gibt es in der IIS-Konfiguration kein Limit von 25 Threads? Zumindest in IIS 6 glaube ich. Wenn Sie dieses Limit überschreiten, können interessante Dinge passieren (lese: looooooo lange Reaktionszeiten).
Je nachdem, was Sie benötigen, haben Sie beim Multithreading erwogen, Anfragen vom Client zu generieren. Es ist sicher, Anfragen mit AJAX zu spawnen und dann die Ergebnisse in einem Callback zu bearbeiten. Oder verwenden Sie einen Service als Hintergrundmechanismus, der alle X Minuten läuft und so im Hintergrund abläuft.
+1 Gute Frage – Nick
Der endgültige Blog über Probleme (obwohl datiert) ist Phil Haacks http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks- in-asp-net.aspx/Es gibt viele Frameworks zum Ausführen von Hintergrundprozessen wie Quartz.NET und HangFire. Wenn Sie mit einer Einschränkung von 90 Sekunden leben können, können Sie sogar QueueBackgroundWorkItem verwenden. Wenn Sie auf Azure, Web Jobs oder Cloud-Services zugreifen. – RickAndMSFT