Я рассматриваю возможность создания асинхронного компонента протоколирования, имеющего выделенный поток, который будет считывать новые элементы из очереди и записывать в базу данных, файл и т. Д. Если я создам поток как фоновый, это будет как только процесс завершится, все объекты в очереди будут потеряны. Если я создаю, это первый план - мне придется выяснить, когда его остановить, поскольку это предотвратит закрытие приложения. Есть ли способ не заставлять разработчиков забывать «останавливать» функции ведения журнала до выхода приложения?посвященный поток для регистрации .net
ответ
Я полагаю, вы можете:
- Подписаться на
AppDomain.ProcessExit
события; - Использовать контрольную переменную
Volatile
в качестве знака отключения ; - Установите флаг при возникновении события
ProcessExit
; - Контролируйте состояние флага внутри вашей нити и изящно закрывайте соответствующим образом.
Таким образом, вы можете оставить переднюю нить осведомленной о надвигающейся обреченности.
Похоже, что OP не имеет возможности изящно закрыться. Не похоже, что его очередь настойчива. –
Это похоже на то, что @JohnSaunders, я согласен - но также кажется, что он имеет некоторый контроль над тем, как создан выделенный поток. Ответ может касаться его беспокойства по поводу предотвращения закрытия приложения. – OnoSendai
Прежде всего, я должен согласиться с комментариями выше. Я бы просто использовал что-то вроде вместо того, чтобы пытаться катиться самостоятельно. Хотя может показаться, что сначала есть чему поучиться, но это все же лучше, чем писать и отлаживать свои собственные.
Если вы действительно хотите путешествовать по этой дороге, я бы рекомендовал использовать инструкцию 'using' и IDisposable для управления асинхронным поведением. Просто запустите нормальный поток в ctor и сигнал & Присоединитесь к теме на Dispose().
Пример использования:
void Main()
{
using (new Logging())
{
...
}
}
Пример класса (непроверенные):
class Logging :IDisposable
{
ManualResetEvent _stop = new ManualResetEvent(false);
Thread _worker = null;
public Logging()
{
_worker = new Thread(AsyncThread);
_worker.Start();
}
public void Dispose()
{
_stop.Set();
_worker.Join();
}
public void AsyncThread()
{
...
}
}
В вашей обычной регистрации, вы хотите проверить, если поток выполняется, а затем решить между очередями на запись журнала или напрямую присоединяется к выходу журнала. Таким образом, сообщения журнала до и после асинхронного потока будут продолжать работать правильно.
- 1. Facebook поток регистрации от Android
- 2. Специфическая часть экрана Посвященный SurfaceView
- 3. suhosin patch посвященный файл журнала
- 4. , посвященный сессиям web.py с subapp?
- 5. Журнал регистрации для .NET Compact Framework?
- 6. Есть ли библиотека регистрации SL4J для .net?
- 7. Поиск автоматического инструмента регистрации/библиотеки для .NET
- 8. .Net + Поток электронной почты
- 9. Шаблон регистрации событий в .net
- 10. Ошибка регистрации страницы в .NET.
- 11. .Net Linq Group по регистрации
- 12. Ошибка регистрации FoxPro vs. .Net
- 13. Искры: IOException, поток закрыт во время регистрации
- 14. Ошибка регистрации сегментации при попытке открыть поток
- 15. Поток регистрации между kafka и zookeeper
- 16. Тот же поток для входа и регистрации: Firebase Auth
- 17. Как «развить» поток в .NET?
- 18. .net Наблюдаемый 'ObserveOn' фоновый поток
- 19. Html + javascript, посвященный языкам на веб-сайте
- 20. , посвященный параллельным и прерванным загрузкам, codeigniter
- 21. Javascript, посвященный веб-работнику для отправки сообщений по запросу
- 22. поток (.NET) обработки передовых методов
- 23. . NET: Запустите поток как приостановленный
- 24. Можно ли клонировать поток .NET?
- 25. Javascript, посвященный нечетному числу аргументов функции
- 26. Конфигурация регистрации для Activiti
- 27. Приложение для регистрации окон
- 28. Лучший подход к регистрации в .NET?
- 29. Отмена регистрации старых версий сборки .net
- 30. Как прервать другой поток в .NET, когда указанный поток выполняет Console.ReadLine?
Не создавайте выделенную тему для управления этим в первую очередь ... он будет тратить большую часть своего времени на то, чтобы ничего не делать. Это довольно расточительно для рамки ведения журнала. В этом случае избегайте создавать собственные рамки ведения журнала; это сложная проблема, которая уже имеет множество доступных решений. – Servy
Этот вопрос может ответить на ваш вопрос: [Как создать асинхронную оболочку для log4net?] (Http://stackoverflow.com/q/7044497/1796930) – Alexander