Pergunta

Meu C # classe deve ser capaz de processar um grande volume de eventos recebidos através de uma conexão de soquete estilo fluxo TCP. O volume de mensagens de eventos recebidos do servidor tcp pela tomada da classe é completamente variável. Por exemplo, às vezes ele só irá receber uma mensagem de evento em um período de dez segundos e em outras vezes ele vai receber um evento mensagens sessenta dentro de um segundo.

Eu estou usando Socket.ReceiveAsync para receber mensagens. ReceiveAsync retorna true se a operação de recebimento está pendente ou falso, se já existem dados sobre o fio ea receber operação foi concluída de forma síncrona. Se a operação está pendente, o Socket irá chamar o meu retorno de chamada em um segmento conclusão IO, caso contrário eu chamar de meu retorno de chamada na atual (COI) rosca. Além disso, misturada com mensagens de eventos Eu também receber respostas para os comandos que foram enviadas para esse servidor tcp. mensagens de resposta são processados ??de imediato; individualmente, disparando um trabalhador threadpool.

No entanto, eu gostaria de mensagens de eventos de fila até que eu tenha "suficiente" (N) deles, ou até que não haja mais sobre o fio é ... e, em seguida, disparar um trabalhador ThreadPool para processar um lote de mensagens de eventos. Além disso, quero todos os eventos a serem processados ??sequencialmente então eu só quero um trabalhador threadpool estar trabalhando em isso em um tempo.

O processador de mensagens de eventos só precisa copiar o buffer de mensagem em um objeto, levantar um evento e, em seguida, liberar o buffer de fundo mensagem na piscina ring-tampão. Então, minha pergunta é ... o que você acha que é a melhor estratégia para conseguir isso?

Precisa de mais informações? Avise-se me. Thanks !!

Foi útil?

Solução

Eu não chamaria 60 eventos por segundo volume alto. Naquele baixo nível de atividade qualquer método de processamento tomada em tudo com fino seja. Eu lidei com 5.000 eventos por segundo em um único segmento usando hardware que é muito menos capaz do que as máquinas atuais, apenas usando select.

Vou dizer que se você estiver olhando para escala, entregando off mensagens individualmente entre threads vai ser um desastre. Você precisa lote ou suas trocas de contexto vai matar o desempenho.

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