.NET隔离存储文件锁定抛出NRE
-
24-09-2019 - |
题
因此,我试图将隔离的存储文件锁定在我的C#客户端应用程序中,以便我的应用程序的多个副本无法同时访问它。我正在使用以下语法:
lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore);
lockStream.Lock(0, 0);
该代码导致我的应用程序从fileStream.lock框架的锁定方法中抛出了nullReferenceException。我尝试使用长度的非零值。我尝试将字节写入文件,然后锁定该字节。无论我做什么,同样的NullReferenceException都会困扰我。有人知道是否可以使用孤立的存储空间?
我还考虑在Silverlight应用程序中使用此技术,Silverlight支持文件锁定是否吗? MSDN文档似乎表明它没有,但我已经看到 这个帖子 从C#MVP中说确实如此。
更新:Microsoft修复了我在Connect上提交的错误,但未在框架版本4中发布。希望它可以在下一个SP或完整版本中提供。
解决方案
这看起来像是框架中的错误。我可能错了,因为这真的太大了,无法实现。
查看带有反射器的.NET 3.5 SP1的源代码,发现了隔离的storagefileStream调用无参数基础构造函数(FileStream(FileStream()),这导致了不实现的基础类别。隔离的storagefilestream创建了一个文件流的实例,并在其覆盖的所有方法中使用它(写,阅读,冲洗,寻求等)。奇怪的是,它不会直接利用其基类。
但是,锁定和解锁并未被覆盖,他们需要一个仍然是无效的私有字段(_handle)(因为所使用的构造函数是无参数)。他们认为这是非毫无用处的,并引起了NRE。
总而言之,不支持锁定和解锁(或越野车)。
我想您被迫使用其他锁定方法,例如静音或信号量。
.NET 4 RC中的实现相同。在Silverlight中,锁定解锁根本根本没有(对于MVP矛盾)。
其他提示
尝试使要锁定的数据量大于0。另外,流中有任何数据,如果没有什么可锁定的可能是问题。
lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore);
lockStream.Write(.....)
lockStream.Lock(0, 10);