2016-06-22 4 views
4

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

6

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.

+0

Danke Stephen Cleary! – Sunny

+0

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

+0

@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). –

1

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.

Verwandte Themen