.NET Async io, die mit dem Aufrufen von Schlaf auf dem Antworthandler verbunden ist
-
25-10-2019 - |
Frage
Ich habe einen Code (auf einem Server), der async -Methoden verwendet, um Daten zu solchen Sockeln zu empfangen:
asyncRes = connectionSocket.BeginReceive(receiveBuffer, 0, RECEIVING_BUFFER_SIZE,
SocketFlags.None, out error, new AsyncCallback(ReceiveDataDone), null);
Im Handler (empfangeneatadone) der Socket gibt es Fälle, in denen Thread.Sleep (x) verwendet wird, um auf andere Dinge zu warten (fragwürdige Implementierung in der Tat). Ich weiß, dass dies ein fragwürdiges Design ist, aber ich frage mich, ob eine solche Art von Code eine Explosion von Threads erklären könnte, die in meiner Anwendung erstellt wurden, da die anderen ausstehenden Steckdosen auf dem Server, auf dem die Empfangsatadone angerufen wurden, angerufen hat. (Wenn viele Verbindungen vom Server behandelt werden, explodiert die Anzahl der erstellten Threads im Aussagen). ich frage mich wie BeginReceive
Methode auf .NET -Sockets funktioniert, was die große Anzahl von Threads erklären könnte, die ich sehe.
Lösung
Sie sollten unbedingt keine Blockierungsaktionen in APM -Rückrufen ausführen. Diese werden im Threadpool ausgeführt. Der Threadpool ist für die Aufruf von kurzlebigen Aufgaben ausgelegt. Wenn Sie blockieren (oder sich lange ausführen), finden Sie (eine begrenzte Anzahl) Threads und verursachen Threadpool -Hunger. Da sich der Threadpool nicht leicht aufdreht (in der Tat ist es ziemlich langsam, zusätzliche Fäden zu starten), sind Sie ein Engpässe auf dem Timing, das steuert, wie schnell der Threadpool neue Threads aufspinnen darf.
Trotz der Beantwortung einer anderen Frage erklärt diese Antwort vor einiger Zeit das gleiche Problem:
Andere Tipps
Sie sollten nicht verwenden Thread.sleep
Wenn Sie in Threadpool -Threads warten, wird der Thread blockiert und akzeptiert keine weiteren Arbeitskräfte für die Zeit, in der er blockiert ist.
Sie können verwenden Timercallback Für einen solchen Anwendungsfall. Es wird das lassen ThreadPool
Planen Sie in der Zwischenzeit andere Arbeiten am Wartefaden.