Хорошо, сначала немного фона. Нам была нужна межпроцессная блокировка чтения / записи. Мы решили использовать файл и заблокировать первый байт, используя LockEx и UnlockEx. Класс создает файл в системной временной папке при его создании. Файл создан с правами чтения и записи и совместного использования чтения | записи | удаления. Мы также указываем DeleteOnClose, чтобы не оставлять множество временных файлов. Очевидно, что AcquireReader и AcquireWriter вызывают LockEx с соответствующими флагами, а ReleaseLock вызывает UnlockEx.
Мы проверили этот класс с помощью небольшого приложения, в котором можно запустить несколько экземпляров, и оно отлично работает. У приложения, которое его использует, есть проблема, которую нам удалось воспроизвести в другом небольшом тестовом приложении. В псевдокоде это
Create InterProcessReaderWriter
Dispose InterProcessReaderWriter without acquiring any locks
Launch a child process which takes a reader lock
При первом запуске это работает нормально. Если вы попытаетесь запустить его снова, пока дочерний процесс с первого раза все еще удерживает блокировку, мы получаем исключение UnauthorisedAccessException при попытке открыть файл.
Похоже, это проблема с правами доступа, а не нарушение общего доступа, но все процессы в этом тестовом примере выполняются как один и тот же пользователь. У кого-нибудь есть идеи?
Я заметил другой вопрос, который предлагает использовать мьютекс и семафор для достижения того, что мы хотим. Я мог бы изменить нашу реализацию, но я все еще хотел бы знать, что вызывает эту проблему.