Question

Je suis en train de verrouiller un fichier de stockage isolé dans mon application cliente C #, de sorte que plusieurs copies de ma demande ne sont pas en mesure d'y accéder en même temps. J'utilise la syntaxe suivante:

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

Ce code fait ma demande de jeter un NullReferenceException à l'intérieur de la méthode FileStream.Lock du cadre. Je l'ai essayé d'utiliser une valeur non nulle pour la longueur. Je l'ai essayé d'écrire un octet dans le fichier et le verrouillage puis juste cet octet. Peu importe ce que je fais, ce même NullReferenceException ne cesse de me affligent. Est-ce que quelqu'un sait si cela est possible avec le stockage isolé?

De plus, je suis à la recherche en utilisant cette technique dans une application Silverlight ainsi, un verrouillage de fichiers de support Silverlight? Les docs MSDN semblent indiquer que ce ne est pas, mais j'ai vu cette poster d'un MVP C # qui dit qu'il fait.

Mise à jour: Microsoft a corrigé le bug que je soumettais sur Connect, mais il n'a pas été publié dans la version 4 du cadre. Il devrait être disponible, espérons dans la prochaine version SP ou complète.

Était-ce utile?

La solution

Cela ressemble à un bug dans le cadre. Je peux me tromper, parce qu'il est vraiment trop grand pour être vrai.

En regardant le code source de .NET 3.5 SP1 avec réflecteur, on trouve le IsolatedStorageFileStream appelle le constructeur de base parameterless (FileStream ()), qui se traduit par une classe de base sans vraiment initialisé. IsolatedStorageFileStream crée une instance d'un FileStream et l'utilise dans toutes les méthodes qu'il surcharge (écriture, lecture, chasse, recherche, etc.). Il est étrange que cela ne profite pas de sa classe de base directement.

Mais verrouillage et le déverrouillage ne sont pas surchargées et ils ont besoin d'un terrain privé (_handle) qui est encore nulle (parce que le constructeur utilisé est le parameterless un). Ils supposent qu'il est non nul et déréférencer et provoquer la NRE.

Pour résumer, verrouiller et déverrouiller ne sont pas pris en charge (ou voiturette).

Je suppose que vous êtes obligé d'utiliser d'autres méthodes de verrouillage comme un Mutex ou Sémaphore.

La mise en œuvre est la même dans .NET 4 RC. Dans Silverlight, un verrouillage de déverrouillage ne sont pas présents à tous (mes excuses pour contredisant un MVP).

Autres conseils

Essayez d'avoir une valeur supérieure à 0 pour la quantité de données à verrouiller. Aussi, est-il des données dans le flux, il n'y a rien à verrouiller qui pourrait être le problème ....

 lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore);
 lockStream.Write(.....)
 lockStream.Lock(0, 10);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top