TcpClient vs Socket ao lidar com assíncrona

Este não é mais um TcpClient vs Socket.

TcpClient é um wrapper em torno da classe Socket para facilitar o desenvolvimento, também expondo o Socket subjacente.

ainda ...

Na página da biblioteca MSDN para a classe TcpClient, pode-se ler a seguinte observação:

A classe TcpClient fornece métodos simples para conectar, enviar e receber dados de fluxo em uma rede no modo de bloqueio síncrono.

E para a classe Socket:

A classe Socket permite que você execute transferência de dados síncrona e assíncrona usando qualquer um dos protocolos de comunicação listados na enumeração ProtocolType.

Para enviar / receber alguns dados de forma assíncrona somente por meio do TcpCient, uma chamada para GetStream deve ser feita para recuperar o NetworkStream subjacente de / no qual os dados podem ser lidos / gravados de forma assíncrona chamando os métodos ReadAsync e WriteAsync, seguindo o padrão TAP (potencialmente usando construções async / await).

Para enviar / receber alguns dados de forma assíncrona via Socket (não sou especialista, mas acho que acertei), podemos ler / escrever diretamente de / na instância do soquete chamando BeginRead / EndRead BeginWrite / EndWrite (ou apenas ReadAsync ou WriteAsync .. não expondo o padrão TAP - ou seja, não retornando uma tarefa .. confuso).

Primeiro de tudo, alguma idéia por que a classe Socket no .NET 4.5 não implementa de qualquer forma o padrão TAP, ou seja, ReadAsync e WriteAsync retornando Task (evento se chamado de forma diferente para preservar compatibilidade com versões anteriores)?

De qualquer forma, fácil o suficiente para construir um método Task a partir do par de métodos modelo APM, então vamos dizer que eu chamo este método assíncrono (para leitura) ReadAsyncTAP (retornando uma tarefa).

OK ? Então agora vamos dizer que eu quero codificar um método clienteasync Task<Byte[]> ReadNbBytes(int nbBytes) que eu chamarei do meu código para ler de forma assíncrona um certo número de bytes da rede.

A implementação desse método baseada exclusivamente em um TcpClient obteria o NetworkStream chamando GetStream e conteria um loop assíncrono aguardando em chamadas ReadAsync até o buffer ficar cheio.

A implementação desse método com base no Socket conteria um loop assíncrono aguardando no ReadAsyncTAP até o buffer ficar cheio.

No final do dia, do ponto de vista do código do cliente, suponho que não faz diferença. Em ambos os casos, a chamada paraawait ReadNbBytes irá "retornar" imediatamente. No entanto, suponho que faça diferença nos bastidores ... Para o TcpClient, contando com o NetworkStream, a leitura de alguma forma bloqueia ou não a qualquer momento, comparado ao uso direto do socket? Se não, a observação feita para o TcpClient está errada ao falar sobre o modo de bloqueio síncrono?

Seria muito apprecited Se alguém pudesse esclarecer!

Obrigado.

questionAnswers(1)

yourAnswerToTheQuestion