Für lange laufenden Betrieb, wenn der asp.net-Thread für andere Anforderungen Server freigegeben ist. Auf welchem Thread wird die lang andauernde Operation ausgeführt und wie wird sie ASP.NET-Thread bei seiner Fertigstellung erhalten.Thread-Verarbeitung in ASP.NET Async Warteoperationen
Antwort
Wie ich in meinem Blog, long-running I/O operations do not require a thread at all beschreiben. Stattdessen verwenden sie natürlich asynchrone E/A, die keinen Thread erfordern.
Gerätetreiber verwenden in der Regel DMA, wodurch das Gerät direkt aus dem Hauptsystem-RAM lesen/schreiben kann. .NET ergänzt diesen Ansatz mit einem IOCP (I/O Completion Port), der Teil des Thread-Pools ist, sodass ein einzelner Thread (oder sehr wenige Threads) pro Anwendungsdomäne auf eine große Anzahl von E/A-Operationen warten kann.
Um die zweite Hälfte Ihrer Frage zu beantworten, die asynchrone Methode wird Lebenslauf mit dem Anforderungskontext, aber es Macht oder möglicherweise nicht auf dem gleichen Thread sei es vor den await
war. Das häufigere Szenario ist, wenn die E/A-Operation abgeschlossen ist, signalisiert es die IOCP, die einen Thread-Pool-Thread für ein bisschen Ordnung (Markierung der Aufgabe als abgeschlossen usw.) benötigt und dann denselben Thread in ASP.NET eingibt Kontext anfordern und die Ausführung des Handlers fortsetzen. Dies geschieht nicht immer passieren - manchmal ist ein Thread-Schalter notwendig - aber es ist der häufigste Fall.
Um Ihre Frage zu beantworten, werden alle Threads aus dem Thread-Pool gezogen.
Ein Beispielszenario kann wie folgt angegeben werden: Wenn eine Anforderung vom Server empfangen wird, wird ein verfügbarer Thread aus dem Pool abgerufen, um die Anforderung zu bedienen.
Dann spawnen Sie einen neuen Thread (entweder Async
oder andere Mittel). Jetzt wird ein neuer Thread aus dem Pool gezeichnet, um die Anfrage Ihres Körpers Async
auszuführen.
Inzwischen ist der ursprüngliche Thread in den Pool freigegeben und geht zurück, um eine andere Anfrage zu bearbeiten.
Wenn das Threading abgeschlossen ist, ruft es einen anderen Thread (nicht den ursprünglichen Thread) aus dem Pool ab und schließt Ihre Anfrage ab.
Es ist völlige Zeitverschwendung, wenn dieser Prozess an die CPU gebunden ist, da Sie einen Thread blockieren (der aus demselben Pool stammt). IO-gebundene Operationen können jedoch wie folgt verarbeitet werden, da sie keine Threads verwenden.
- 1. Async-Controller in ASP.NET MVC
- 2. Async-Aktionsfilter: Async & AuthorizeAttribute in der ASP.NET-Web-API
- 3. ASP.NET Async/erwarten Teil 2
- 4. ASP.NET MVC 5 Async-Kontextverwaltung
- 5. Async Aktionen in ASP.NET MVC 4
- 6. Task.Run() in async ASP.Net MVC-Controller-Aktion
- 7. Jquery, ASP.NET MVC Async Aufgabe?
- 8. Wie ASP.Net MVC-Controller-Aktion Async
- 9. ASP.NET MVC Async Action funktioniert nicht richtig
- 10. Der beste Weg, Async-Programmierung mit Asp.Net
- 11. webapi C# verwirrende Belastung Testergebnisse mit Async erwarten
- 12. Wie kann ich Async-Methoden in asp.net C# 4.0 aufrufen?
- 13. Ist die Verwendung von async/await in ASP.NET-Ereignishandlern sicher?
- 14. ASP.NET: Ist es möglich, Async-Task in Global.asax aufzurufen?
- 15. Verschachtelte Async-Download - Async innerhalb von Async
- 16. Async Aktionsmethoden
- 17. Async-Funktion Thread.Sleep in der Webanwendung
- 18. Verzögerter Job für ASP.NET zum Ausführen von Async-Code?
- 19. Führen Sie Async-Vorgang asp.net MVC außerhalb der Aktion
- 20. Spielt ASP.net MVC 3.0 RTM gut mit dem ASYNC CTP?
- 21. ASP.NET Identity 2 UserManager erhält alle Benutzer async
- 22. ASP.NET C# 5 asynchrone Web-Anwendungen mit Async & warten
- 23. Wo sind FILE.ReadAll *** Async/WriteAll *** Async/AppendAll *** Async-Methoden?
- 24. ASP.NET Web API 2 Async-Aktionsmethoden mit Task.Run-Leistung
- 25. Proper Stack Trace von Asp.Net Web API Async/Taskaufrufe
- 26. Async AJAX-Aufrufe mit jQuery ASP.NET funktioniert nicht
- 27. Async-Modifikator in C#
- 28. Async in Android Studio
- 29. Async-Aktionen in Redux
- 30. Async in MVC
Danke Stephen Cleary! – Sunny
Was ist, wenn es sich nicht um eine E/A-Operation handelt? Wenn es sich um eine Geschäftslogik handelt, die innerhalb einer Funktion ausgeführt wird und so viel Zeit in Anspruch nimmt. Würde es keinen neuen Thread erstellen. – Sunny
@Sunny: Nein. Wenn Sie "Async" ohne "erwarten" verwenden, wird der Code nur direkt im aufrufenden Thread ausgeführt. Wenn Sie 'awarte Task.Run' verwenden, verwendet die' Task.Run' (* nicht * die 'async' /' await') einen separaten Thread-Pool-Thread (Hinweis: Dies wird nicht für ASP.NET empfohlen). –