Pergunta

Eu estava brincando com a comunicação TCP do Silverlight e eu fui forçado a usar a classe System.Net.Sockets.Socket que, em tempo de execução do Silverlight tem apenas métodos assíncronos.

Eu estava me perguntando o que acontece se dois segmentos chamar SendAsync em uma instância de soquete em um curto espaço de uma só vez do outro?

A minha preocupação única é a de não ter misturado bytes atravessar o canal TCP.

Sendo um método assíncrono Suponho a mensagem é colocado em uma fila a partir do qual um único Retiradas da fila de rosca de forma que nenhum essas coisas vai acontecer (misturando conteúdo da mensagem no fio).

Mas eu não estou certo eo MSDN não faz nada estado na descrição do método. Tem alguém certeza isso?

EDIT1: Não, o bloqueio em um objeto antes de chamar SendAsync tais como:

lock(this._syncObj)
{
    this._socket.SendAsync(arguments);
}

não ajuda uma vez que este serializa as solicitações para enviar dados não os dados realmente enviados.

Foi útil?

Solução

A fim de chamar a SendAsync você precisa primeiro ter chamado ConnectAsync com uma instância do SocketAsyncEventArgs. É a instância de SocketAsyncEventArgs que representa a conexão entre o cliente eo servidor. Chamando SendAsync com a mesma instância do SocketAsyncEventArgs que acaba de ser utilizado para uma chamada excepcional para SendAsync irá resultar em uma exceção.

É possível fazer várias chamadas pendentes para SendAsync do mesmo objeto Socket mas apenas usando diferentes instâncias de SocketAsyncEventArgs. Por exemplo (em um universo paralelo onde isso pode ser necessay) você poderia fazer várias postagens HTTP para o mesmo servidor ao mesmo tempo, mas em conexões diferentes. Isto é perfeitamente aceitável e normal nem o cliente nem servidor vai ficar confuso sobre qual pacote é qual.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top