Я использую Enterprise Library 4 в одном из моих проектов для ведения журнала (и других целей). Я заметил, что для регистрации, которую я делаю, существует некоторая стоимость, которую я могу смягчить, выполнив ведение журнала в отдельном потоке.Как эффективно регистрировать асинхронно?
То, как я делаю это сейчас, это то, что я создаю объект LogEntry, а затем я вызываю BeginInvoke на делегат, который вызывает Logger.Write.
new Action<LogEntry>(Logger.Write).BeginInvoke(le, null, null);
Что я действительно хочу сделать, это добавить лог сообщение в очередь и затем один поток тяговых экземпляров LogEntry из очереди и выполнение операции журнала. Преимущество этого заключалось в том, что ведение журнала не мешает выполнению операции, а не каждая операция ведения журнала приводит к тому, что задание запускается в пуле потоков.
Как создать общую очередь, которая поддерживает множество писателей и одного считывателя потоковым безопасным способом? Некоторые примеры реализации очереди, которые предназначены для поддержки многих авторов (без создания синхронизации/блокировки) и одного читателя, будут действительно оценены.
Рекомендация относительно альтернативных подходов также будет оценена, но я не заинтересован в изменении рамок регистрации.
@spoon, я добавил немного улучшенная версия, имейте в виду, что вам придется много раз протестировать ее, прежде чем использовать ее, потому что я просто ее сбил. –
Хотя этот вопрос не применим непосредственно к этому вопросу (так как он говорит EntLib 4), корпоративная библиотека 6 теперь поддерживает асинхронное ведение журнала. –