因此,我试图将隔离的存储文件锁定在我的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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top