.NET Async io, die mit dem Aufrufen von Schlaf auf dem Antworthandler verbunden ist

StackOverflow https://stackoverflow.com/questions/8311255

  •  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.

War es hilfreich?

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:

https://stackoverflow.com/a/1733226/14357

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top