Tratando de averiguar si debería o no utilizar métodos asincrónicos o no, tales como:¿Es necesario utilizar los métodos async Begin/End si ya están en una secuencia separada?
y
a diferencia de sus versiones síncronas TcpListener.AcceptTcpClient
y NetworkStream.Read
. He estado buscando hilos relacionados pero todavía estoy un poco inseguro sobre una cosa:
Pregunta: La principal ventaja de utilizar un método asincrónico es que la GUI no está bloqueada. Sin embargo, estos métodos serán llamados en hilos Task por separado, por lo que no hay ninguna amenaza de eso. Además, TcpListener.AcceptTcpClient
bloquea el hilo hasta que se realice una conexión para que no se desperdicien los ciclos de la CPU. Dado que este es el caso, ¿por qué tantos siempre recomiendan usar las versiones asíncronas? Parece que en este caso las versiones sincrónicas serían superiores?
Además, otra desventaja del uso de métodos asíncronos es la mayor complejidad y el constante vaciado de objetos. Por ejemplo, tener que hacer esto:
private void SomeMethod()
{
// ...
listener.BeginAcceptTcpClient(OnAcceptConnection, listener);
}
private void OnAcceptConnection(IAsyncResult asyn)
{
TcpListener listener = (TcpListener)asyn.AsyncState;
TcpClient client = listener.EndAcceptTcpClient(asyn);
}
En oposición a esto:
TcpClient client = listener.AcceptTcpClient();
También parece que las versiones asíncronas tendrían mucha más sobrecarga debido a tener que crear otro hilo. (Básicamente, cada conexión tendría un hilo y luego al leer ese hilo también tendría otro hilo. Threadception!)
Además, está el boxeo y el desempaquetado del TcpListener y la sobrecarga asociada a la creación, administración y cierre estos hilos adicionales.
Básicamente, donde normalmente solo habría subprocesos individuales para manejar conexiones de cliente individuales, ahora hay eso y luego un subproceso adicional para cada tipo de operación realizada (leer/escribir datos de secuencia y escuchar nuevas conexiones en el extremo del servidor)
Corrígeme si me equivoco. Todavía soy nuevo en el roscado y estoy tratando de entender todo esto. Sin embargo, en este caso, parece que usar los métodos síncronos normales y simplemente bloquear el hilo sería la solución óptima.