Como efetivamente registrar de forma assíncrona?

Eu estou usando o Enterprise Library 4 em um dos meus projetos para log (e outros fins). Percebi que há algum custo para o registro em log que estou fazendo que posso atenuar fazendo o registro em um thread separado.

A maneira como estou fazendo isso agora é que eu criar um objeto LogEntry e, em seguida, chamo BeginInvoke em um delegado que chama Logger.Write.

new Action<LogEntry>(Logger.Write).BeginInvoke(le, null, null);

O que eu realmente gostaria de fazer é adicionar a mensagem de log a uma fila e, em seguida, ter um único thread retirando instâncias de LogEntry da fila e executando a operação de log. O benefício disso seria que o log não está interferindo na operação em execução e nem toda operação de log resulta em um job sendo lançado no pool de threads.

Como posso criar uma fila compartilhada que suporte muitos gravadores e um leitor de maneira segura? Alguns exemplos de uma implementação de fila projetada para suportar muitos gravadores (sem causar sincronização / bloqueio) e um único leitor seriam muito apreciados.

Recomendações sobre abordagens alternativas também seriam apreciadas, mas não estou interessado em mudar as estruturas de registro.

questionAnswers(10)

yourAnswerToTheQuestion