Блокировка файлов изолированного хранилища .NET выдает NRE - PullRequest
4 голосов
/ 05 марта 2010

Поэтому я пытаюсь заблокировать изолированный файл хранилища в моем клиентском приложении C #, чтобы несколько копий моего приложения не могли получить к нему доступ одновременно. Я использую следующий синтаксис:

lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore);
lockStream.Lock(0, 0);

Этот код заставляет мое приложение генерировать исключение NullReferenceException из метода FileStream.Lock платформы. Я попытался использовать ненулевое значение для длины. Я попытался записать байт в файл, а затем заблокировал только этот байт. Независимо от того, что я делаю, это то же самое исключение NullReferenceException продолжает преследовать меня. Кто-нибудь знает, возможно ли это с изолированным хранилищем?

Кроме того, я также собираюсь использовать эту технику в приложении Silverlight, поддерживает ли Silverlight блокировку файлов? Документы MSDN, кажется, указывают, что это не так, но я видел этот пост от C # MVP, который говорит, что это так.

Обновление: Microsoft исправила ошибку, которую я представил в Connect, но она не была выпущена в версии 4 платформы. Надеюсь, он будет доступен в следующем SP или в полной версии.

Ответы [ 2 ]

4 голосов
/ 05 марта 2010

Это похоже на ошибку в Framework.Я могу ошибаться, потому что он действительно слишком большой, чтобы быть правдой.

Глядя на исходный код .NET 3.5 SP1 с Reflector, можно обнаружить, что IsolatedStorageFileStream вызывает базовый конструктор без параметров (FileStream ()), которыйприводит к не инициализированному базовому классу.IsolatedStorageFileStream создает экземпляр FileStream и использует его во всех методах, которые он переопределяет (Write, Read, Flush, Seek и т. Д.).Странно, что он не использует преимущества своего базового класса напрямую.

Но Lock и Unlock не переопределяются, и им нужно личное поле (_handle), которое все еще равно нулю (поскольку используемый конструктор является параметрическим).Они предполагают, что он ненулевой, и разыменовывают его и приводят к тому, что NRE.

Подводя итог, блокировка и разблокировка не поддерживаются (или глючат).

Я предполагаю, что вы вынуждены использовать другиеметоды блокировки, такие как Mutex или Semaphore.

Реализация такая же в .NET 4 RC.В Silverlight блокировка разблокировки вообще отсутствует (мои извинения за противоречие с MVP).

0 голосов
/ 05 марта 2010

Попробуйте задать значение больше 0 для объема данных, которые нужно заблокировать. Кроме того, есть ли какие-либо данные в потоке, если нет ничего для блокировки, что может быть проблемой ...

 lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore);
 lockStream.Write(.....)
 lockStream.Lock(0, 10);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...