Pregunta

Tengo un código (en un servidor) que usa el método Async para recibir datos en sockets como este:

asyncRes = connectionSocket.BeginReceive(receiveBuffer, 0, RECEIVING_BUFFER_SIZE,
    SocketFlags.None, out error, new AsyncCallback(ReceiveDataDone), null);

En el manejador (recibido) del enchufe hay casos en que se usa hilt.sleep (x) para esperar otras cosas (implementación cuestionable de hecho). Sé que este es un diseño cuestionable, pero me pregunto si hacer ese tipo de código podría explicar una explosión de los hilos creados en mi aplicación debido a los otros enchufes pendientes en el servidor que se les ha llamado recibido. (Cuando el servidor maneja muchas conexiones, el número de subprocesos creados explota en sentido figurado). Me pregunto cómo BeginReceive El método en los enchufes .NET funciona, eso podría explicar la gran cantidad de hilos que veo.

¿Fue útil?

Solución

Absolutamente no debe realizar ningún tipo de acción de bloqueo en las devoluciones de llamada APM. Estos se ejecutan en el threadpool. Threadpool está diseñado para la invocación de tareas de corta duración. Si bloquea (o tarda mucho en ejecutar), está vinculando (un número finito de hilos) y causando la inanición de threadpool. Debido a que el threadpool no gira hilos adicionales fácilmente (de hecho, es bastante lento iniciar hilos adicionales), está reclutando la botella en el momento que controla la rapidez con que se permite que el pecho de Threadpool gire nuevos hilos.

A pesar de responder una pregunta diferente, esta respuesta que proporcioné hace un tiempo explica el mismo problema:

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

Otros consejos

No deberías usar Thread.sleep Para esperar en los hilos de threadpool, esto hace que el hilo se bloquee y no aceptará ningún equipo de trabajo adicional para el tiempo que está bloqueado.

Puedes usar Timercallback para tal caso de uso. Dejará que el ThreadPool Programe otro trabajo en el hilo de espera mientras tanto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top