Pregunta

Por lo tanto, estoy tratando de bloquear un archivo de almacenamiento aislado en mi aplicación de cliente C#, para que varias copias de mi aplicación no puedan acceder a él al mismo tiempo. Estoy usando la siguiente sintaxis:

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

Este código hace que mi aplicación arroje una NullReferenceException desde el interior del método FileStream.Lock del marco. He intentado usar un valor distinto de cero para la longitud. He intentado escribir un byte en el archivo y luego bloquear solo ese byte. No importa lo que haga, esa misma NullreferenceException me sigue plagando. ¿Alguien sabe si esto es posible con el almacenamiento aislado?

También estoy buscando usar esta técnica en una aplicación Silverlight, ¿Silverlight admite el bloqueo del archivo? Los documentos de MSDN parecen indicar que no lo hace, pero he visto esta publicación De un C# MVP que dice que sí.

Actualización: Microsoft ha solucionado el error que envié en Connect, pero no se lanzó en la versión 4 del marco. Debería estar disponible con suerte en el próximo SP o la versión completa.

¿Fue útil?

Solución

Esto parece un error en el marco. Puede que me equivoque, porque es realmente demasiado grande para ser verdad.

Mirando el código fuente de .NET 3.5 SP1 con Reflector, se encuentra el Aislado StorageFilErteam llama al constructor de base sin parámetros (FilEstream ()), que da como resultado una clase base no inicializada. Aislado StorageFilSteam crea una instancia de un FileStream y lo usa en todos los métodos que anula (escriba, lea, descarga, busca, etc.). Es extraño que no aproveche su clase base directamente.

Pero el bloqueo y el desbloqueo no se anulan y necesitan un campo privado (_handle) que aún sea nulo (porque el constructor utilizado es el sin parámetros). Asumen que no es nulo y lo desreferencia y causa el NRE.

Para resumir, bloquear y desbloquear no son compatibles (o errores).

Supongo que te ves obligado a usar otros métodos de bloqueo como un mutex o semáforo.

La implementación es la misma en .NET 4 RC. En Silverlight, Lock An Uplock no está presente (mis disculpas por contradecir un MVP).

Otros consejos

Intente tener un valor mayor que 0 para la cantidad de datos para bloquear. Además, ¿hay algún dato en la transmisión, si no hay nada que bloquear que pueda ser el problema ...

 lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore);
 lockStream.Write(.....)
 lockStream.Lock(0, 10);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top