Você está solicitando latências extremamente baixas e previsíveis de um idioma com um coletor de lixo. O GC irá pausar seu programa por X milissegundos a cada intervalo Y enquanto o encadeamento GC estiver sendo executado.
Você pode usar o Windows Performance Toolkit para verificar isso, se quiser.
Você pode ajustar um pouco o coletor de lixo com
GCSettings.LatencyMode = GCLatencyMode.LowLatency;
Mas ainda terá que ser executado eventualmente.
Esta é uma das razões pelas quais você não vê muitos jogos 3D de grande sucesso escritos em C #.
Ajuste o GC se quiser, mas acho que a melhor solução para esse tipo de aplicativo é mudar para código nativo.
Você também está executando o Windows 7, que é configurado para quantums de encadeamentos mais curtos do que um SO do servidor, o que significa que o contexto é alternado com mais frequência. (Ironicamente, isso é assim que a máquina se sente "mais rápida".)
Você pode mudar isso com a configuração ' Ajustar para melhor desempenho dos Serviços em Segundo Plano '. Essa é uma configuração de todo o sistema e é a configuração do Windows Server. O que ele faz é tornar o encadeamento do sistema mais longo, o que significa que os encadeamentos são executados muito antes de outra decisão de planejamento de encadeamento ser feita, o que significa menos opções de contexto. A idéia é que, com quantums de thread mais longos, um thread de servidor, uma vez selecionado para execução pelo agendador de thread, poderá continuar funcionando por mais tempo e ter uma melhor chance de terminar seu trabalho (ou seja, atendendo a uma solicitação do cliente) antes de ser interrompido / preempção por outro thread no sistema.
Finalmente, se nenhuma das opções acima ajudar, pode ser outra coisa. Neste ponto, você desejaria analisar o sistema com o Windows Performance Toolkit e descobrir que as intermitências de latência são causadas pelo driver da NIC, a plataforma de filtragem do Windows, algo na pilha de E / S ... quem sabe .