.Net Изолированные блокировка файла хранения бросает NRE

StackOverflow https://stackoverflow.com/questions/2383160

Вопрос

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

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

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

Также я ищу эту технику в приложении Silverlight, а также блокировка файла Silverlight поддерживает файл? MSDN Docs, похоже, указывает на то, что он не так, но я видел эта почта от C # MVP, который говорит, что это делает.

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

Это было полезно?

Решение

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

Глядя на исходный код .NET 3.5 SP1 с отражателем, можно найти изолированныйStorageFileStreStream, вызывает базовый конструктор PARMETERLALL (FILESTREAM ()), который приводит к неактивному базовому классу. ИзолированныеStorageFileStream создает экземпляр FileStream и использует его во всех методах, которые оно переопределяет (писать, прочитанные, промывка, поиск и т. Д.). Странно, что он не использует преимущества своего базового класса напрямую.

Но блокировка и разблокировка не переоценены, и им нужна частное поле (_Handle), которое все еще ненужно (поскольку используемый конструктор является параметрами). Они предполагают, что это ненульна и неэффектное, и вызвать НР.

Для суммирования блокировки и разблокировки не поддерживаются (или багги).

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

Реализация одинакова в .NET 4 RC. В Silverlight заблокируйте разблокировку вообще не присутствуют (мои извинения, чтобы противоречить МВП).

Другие советы

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

 lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore);
 lockStream.Write(.....)
 lockStream.Lock(0, 10);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top