Domanda

Quindi sto cercando di bloccare un file di archiviazione isolato nella mia applicazione client C#, in modo che più copie della mia applicazione non siano in grado di accedervi contemporaneamente. Sto usando la seguente sintassi:

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

Questo codice fa sì che la mia applicazione lanci un NullReferenceException dall'interno del metodo FileStream.lock del framework. Ho provato a usare un valore diverso da zero per la lunghezza. Ho provato a scrivere un byte sul file e poi bloccare solo quel byte. Non importa quello che faccio, lo stesso NullreferenceException continua a affliggermi. Qualcuno sa se questo è possibile con l'archiviazione isolata?

Inoltre sto cercando di utilizzare questa tecnica anche in un'applicazione Silverlight, Silverlight supporta il blocco dei file? I documenti MSDN sembrano indicare che non lo fa, ma ho visto questo post Da un MVP C# che dice che lo fa.

AGGIORNAMENTO: Microsoft ha risolto il bug che ho inviato su Connect, ma non è stato rilasciato nella versione 4 del framework. Dovrebbe essere disponibile, si spera nel prossimo SP o a rilascio completo.

È stato utile?

Soluzione

Sembra un bug nel framework. Potrei sbagliarmi, perché è davvero troppo grande per essere vero.

Osservando il codice sorgente di .NET 3.5 SP1 con riflettore, si trova il filestream IsolatedStorage chiama il costruttore di base senza parametri (FileStream ()), che si traduce in una classe base non appena iniziativa. IsolatedStorageFestream crea un'istanza di un filestream e lo utilizza in tutti i metodi che si prepara (scrivere, leggere, sciacquare, cercare, ecc.). È strano che non sfrutta direttamente la sua classe di base.

Ma blocco e sblocchi non sono ignorati e hanno bisogno di un campo privato (_handle) che è ancora nullo (perché il costruttore utilizzato è quello senza parametri). Presumono che non sia nullo e dereference e causano l'NRE.

Per riassumere, bloccare e sbloccare non sono supportati (o buggy).

Immagino che tu sia costretto a usare altri metodi di blocco come un mutex o un semaforo.

L'implementazione è la stessa in .NET 4 RC. In Silverlight, blocca uno sblocco non sono affatto presenti (le mie scuse per la contraddizione di un MVP).

Altri suggerimenti

Prova ad avere un valore superiore a 0 per la quantità di dati da bloccare. Inoltre, ci sono dati nel flusso, se non c'è nulla da bloccare che potrebbe essere il problema ...

 lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore);
 lockStream.Write(.....)
 lockStream.Lock(0, 10);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top