Ich frage mich, was passiert, wenn es keine IO-Threads gibt, die das Ergebnis eines Async-Aufrufs behandeln.
Angenommen, Sie erstellen eine asynchrone Webanfrage (in einer Serveranwendung, so dass der gesamte Async-Code vom Thread-Pool verarbeitet wird). Das Betriebssystem signalisiert, wenn ein Ergebnis für Sie vorliegt. Wenn dies der Fall ist, benötigen Sie einen IO-Thread, um die Bytes aus dem Socket zu lesen. Wenn keine IO-Threads verfügbar sind, weil diese alle verwendet werden (alle Bedeutungen bis zu dem Maximum, das vom Thread-Pool festgelegt wird), was passiert? Gibt es eine Warteschlange, in der das Signal warten kann, bis ein Thread verfügbar ist? Oder geht das Signal einfach ungehört? Wenn letzteres passiert, was passiert mit dem Code, der auf die Wartezeit wartet?
Wenn Sie den Thread-Pool nicht eingeschränkt haben, werden bei Bedarf neue E / A-Threads erstellt. Das Signal wartet in einer Warteschlangen-ähnlichen Struktur namens I / O Completion Port (IOCP) , bis es abgerufen wird; Signale sind nicht verloren.
Lassen Sie uns zu früheren Zeiten zurückgehen, wenn OS
zu vorläufig verwendet hat und nicht viel von concurrency
, dann, wenn Sie mehrere Anwendungen öffnen, die IO
wie Excel, Word, Pdf, Ppt
benötigen, erscheint system hängen und unempfänglich sein, da es nicht alle zusammen behandeln kann, aber wenn du aufhörst mehr Anfragen zu stellen, und das System nicht abstürzt, dann wirst du sehen, dass alle ihre Chance bekommen und sie wieder aktiv werden.
Dies ist ein typischer Anwendungsfall von IO requests
wurde in die Warteschlange gestellt und wartet darauf, verarbeitet zu werden, keiner von ihnen ist verloren, bis das System abstürzt, was heutzutage aufgrund der Robustheit der Implementierung nicht mehr häufig geschieht Blauer Bildschirm des Todes, der immer noch passieren kann und das ist der einzige Punkt, wenn IO-Anfragen verloren gehen.
Tatsächlich besteht die Essenz von Threading in Windows darin, Robustheit bereits vor der Parallelität einzuführen, so dass nichts, das zur Verarbeitung in die Warteschlange gestellt wird, verloren geht. Zu keinem Zeitpunkt wird das Limit überschritten, um mehr als die erforderliche Anzahl von Threads zu erstellen.
Tags und Links c# async-await