Pergunta

Em C #, quando recebendo dados da rede com as BeginReceive / métodos EndReceive, há alguma razão você não deve processar os pacotes assim que você recebê-los? Algumas das tarefas pode ser decentemente intensivo da CPU. Eu pergunto porque eu vi algumas implementações que empurram os pacotes fora em uma fila de processamento e, em seguida, tratá-los lá. Para mim, isso parece porque redundante, tanto quanto eu sei, os métodos assíncronos também operar em um pool de threads.

Foi útil?

Solução

Como Mitch aponta, você precisa ser capaz de receber pacotes suficientes para ter uma mensagem / frame completa. Mas não há nenhuma razão porque você não deve iniciar o processamento desse quadro imediatamente e emitir outra BeginReceive. Na verdade, se você acredita que seu processamento pode levar algum tempo, é melhor entregá-lo ao trabalhador thread-piscina em vez de bloco de um thread do i / o piscina (que é onde o seu retorno vai disparar).

Além disso, a menos que você está esperando um baixo número de conexões, gerando uma thread para lidar com cada conexão não é uma abordagem muito escalável, embora não têm o benefício de alguns simplicidade.

Eu escrevi recentemente um artigo sobre canalizando os dados de processamento de fora de uma tomada de rede, onde pode encontrar aqui .

Outras dicas

Geralmente, você precisa receber pacotes 'suficiente' para ter um item de dados que é 'processado'.

IMO, é melhor ter um segmento cuja função é receber dados, e outro para realmente processá-lo.

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