Frage

Daher versuche ich, eine isolierte Speicherdatei in meiner C# Client -Anwendung zu sperren, damit mehrere Kopien meiner Anwendung nicht gleichzeitig darauf zugreifen können. Ich verwende die folgende Syntax:

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

Dieser Code veranlasst meine Anwendung, eine NullReferencexception aus der fileStream.lock -Methode des Frameworks zu werfen. Ich habe versucht, einen Wert ungleich Null für die Länge zu verwenden. Ich habe versucht, ein Byte in die Datei zu schreiben und dann genau dieses Byte zu sperren. Egal was ich tue, dieselbe Nullreferencexception plagt mich immer wieder. Weiß jemand, ob dies mit isoliertem Speicher möglich ist?

Außerdem suche ich diese Technik auch in einer Silverlight -Anwendung, unterstützt Silverlight die Dateiverriegelung? Die MSDN -Dokumente scheinen darauf hinzudeuten, dass dies nicht der Fall ist, aber ich habe gesehen dieser Beitrag von einem C# MVP, das sagt, dass es es tut.

UPDATE: Microsoft hat den Fehler behoben, den ich auf Connect eingereicht habe, wurde jedoch nicht in Version 4 des Frameworks veröffentlicht. Es sollte hoffentlich in der nächsten SP oder in der vollständigen Veröffentlichung erhältlich sein.

War es hilfreich?

Lösung

Dies sieht aus wie ein Fehler im Framework. Ich mag mich irren, weil es wirklich zu groß ist, um wahr zu sein.

Wenn man den Quellcode von .NET 3.5 SP1 mit Reflektor betrachtet, findet man den isolierten StorageFilestream auf den parameterlosen Basiskonstruktor (fileStream ()), was zu einer nicht real initialisierten Basisklasse führt. IsolatedStorageFilESTREAM erstellt eine Instanz eines FileStream und verwendet ihn in allen Methoden, die er überschreibt (schreiben, lesen, spülen, suchen usw.). Es ist seltsam, dass es seine Basisklasse nicht direkt ausnutzt.

Aber Sperre und Entsperren sind nicht überschrieben und benötigen ein privates Feld (_handle), das immer noch null ist (weil der verwendete Konstruktor die parameterlose ist). Sie gehen davon aus, dass es nicht null ist und die Theeference ist und die NRE verursachen.

Zusammenfassend lässt sich sagen, dass Sperren und Entsperren nicht unterstützt werden (oder fehlerhaft).

Ich denke, Sie sind gezwungen, andere Sperrmethoden wie einen Mutex oder ein Semaphor zu verwenden.

Die Implementierung ist in .NET 4 RC gleich. In Silverlight ist das Lock -A -Freischalt überhaupt nicht vorhanden (ich entschuldige mich dafür, dass ich einem MVP widersprach).

Andere Tipps

Versuchen Sie, einen Wert von mehr als 0 zu haben, damit die Datenmenge gesperrt werden müssen. Gibt es auch Daten im Stream, wenn es nichts zu sperren gibt, das das Problem sein könnte ....

 lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore);
 lockStream.Write(.....)
 lockStream.Lock(0, 10);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top