Насколько мне известно, Windows не имеет то, что вы ищете.Не существует объекта дескриптора файла, который выполняет автоматическую синхронизацию, блокируя всех других пользователей во время записи в файл.
Если регистрация ведется в три этапа: открыть файл, записать, закрыть файл, тогда выПотоки пытаются открыть файл в монопольном режиме (FileShare.None
), перехватить исключение, если не удается открыть, и затем повторить попытку до успеха.В лучшем случае я нашел это утомительным.
В моих программах, которые ведут журнал из нескольких потоков, я создал TextWriter
потомка, который по сути является очередью.Потоки вызывают методы Write
или WriteLine
для этого объекта, который форматирует выходные данные и помещает их в очередь (используя BlockingCollection
).Отдельный поток ведения журнала, который ставит в очередь - извлекает из него вещи и записывает их в файл журнала.Это имеет несколько преимуществ:
- Потоки не должны ждать друг друга для записи
- Только один поток пишет в файл
- Этотривиально вращать журналы (т. е. запускать новый файл журнала каждый час и т. д.)через процессы будет намного сложнее.Я никогда даже не думал о том, чтобы попытаться поделиться файлом журнала между процессами.Если бы мне это было нужно, я бы создал отдельное приложение (сервис регистрации).Это приложение будет выполнять фактическую запись, а другие приложения будут передавать строки для записи.Опять же, это гарантирует, что я не могу все испортить, и мой код остается простым (т.е. нет явного кода блокировки в клиентах).