Comment connecter de manière asynchrone?

Je suis en utilisant Entreprise de la Bibliothèque 4 sur un de mes projets pour l'enregistrement (et à d'autres fins). J'ai remarqué qu'il y a un certain coût pour l'enregistrement que je fais que je puisse atténuer en faisant la journalisation sur un thread séparé.

La façon dont je le fais maintenant, c'est que j'ai créer un LogEntry objet, puis-je appeler BeginInvoke un délégué qui appelle Enregistreur.Écrire.

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

Ce que j'aimerais vraiment faire est d'ajouter le journal de message à une file d'attente et ensuite avoir un seul thread tirant LogEntry instances de la file d'attente et la réalisation de l'opération de journal. L'avantage de ce serait que la journalisation est de ne pas interférer avec l'exécution de l'opération et non pas chaque opération d'enregistrement des résultats dans un emploi projeté sur le pool de threads.

Comment puis-je créer une file d'attente partagée qui prend en charge de nombreux écrivains et un lecteur dans un thread de façon sécuritaire? Quelques exemples d'une file d'attente de mise en œuvre qui vise à soutenir de nombreux écrivains (sans causer de synchronisation/bloquer) et un seul lecteur serait vraiment apprécié.

Recommandation sur des approches alternatives serait aussi apprécié, je ne suis pas intéressé à changer la journalisation des cadres bien.

  • J'ai ajouté une version légèrement améliorée, gardez à l'esprit que vous aurez à tester beaucoup avant de l'utiliser, car je viens juste d'en il.
  • Bien que n'étant pas directement applicable à cette question (puisqu'il parle EntLib 4), Bibliothèque d'Entreprise 6 prend désormais en charge Asynchrone de vous déconnecter de la boîte.