Мне нужно перехватить поток (ы) вывода на консоль, чтобы захватить его для журнала, но все же передать его в исходный поток, чтобы приложение работало правильно. Это, очевидно, означает сохранение исходного Console.Out
TextWriter перед его заменой на Console.SetOut(new MyTextWriterClass(originalOut))
.
Я предполагаю, что отдельные операции для получения свойства Out и вызова метода SetOut () реализованы Console
в поточно-ориентированном режиме. Но я хотел бы убедиться, что какой-то другой поток (например, запуск кода клиентского приложения, который я не контролирую и не могу ожидать изменить, и поэтому я не могу полагаться на свою собственную схему блокировки), не может случайно изменить его между моими get и set и в итоге перезаписать его изменением (нарушением поведения их приложения!). Поскольку другой код может просто вызывать SetOut (), мой код в идеале должен получить такую же блокировку, используемую внутри Console
(при условии, что она есть).
К сожалению, Console
- это (статический) класс, а не экземпляр, поэтому вы не можете просто lock (Console)
. И, глядя на документацию класса, похоже, нет никаких упоминаний о блокировке. Это обычно не ожидаемое использование этих методов консоли, но должен быть какой-то безопасный способ сделать это как элементарную операцию.
В случае отсутствия стандартной схемы блокировки, есть ли другой способ обеспечить это? Для такого короткого критического раздела (и выполняется только один раз) даже кратковременная блокировка всех других потоков может быть приемлемой, если это единственный способ сделать это. Мы используем C # и .NET2.0.
Если нет даже , что возможно (без нарушения работы клиентского приложения), тогда мы просто должны полагаться на то, что весьма маловероятно, что клиентское приложение перенаправит свой вывод консоли и случается делать это между нашими операциями get и set. Я просто хотел бы охватить все базы, на всякий случай.
Редактировать : Теперь, когда у нас есть конкретный ответ с примером кода, я перефразировал заголовок вопроса, чтобы более широко отражать случаи использования, в которых ответы могут помочь, чтобы быть более понятными. Также добавлен тег для «атомного».