.NET隔离存储文件锁定会抛出NRE

时间:2010-03-04 22:19:28

标签: c# .net silverlight isolatedstorage filelock

所以我试图在我的C#客户端应用程序中锁定一个独立的存储文件,这样我的应用程序的多个副本就无法同时访问它。我使用以下语法:

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

此代码导致我的应用程序从框架的FileStream.Lock方法内部抛出NullReferenceException。我尝试使用非零值作为长度。我试过写一个字节到文件然后只锁定那个字节。无论我做什么,同样的NullReferenceException一直困扰着我。有谁知道隔离存储是否可行?

此外,我也在Silverlight应用程序中使用此技术,Silverlight是否支持文件锁定? MSDN文档似乎表明它没有,但我从C#MVP中看到this post表示它确实存在。

更新:Microsoft修复了我在Connect上提交的错误,但它未在框架的第4版中发布。它应该可以在下一个SP或完整版本中使用。

2 个答案:

答案 0 :(得分:4)

这看起来像是框架中的一个错误。我可能错了,因为它真的太大了,不可能成真。

查看带有Reflector的.NET 3.5 SP1的源代码,可以发现IsolatedStorageFileStream调用无参数的基本构造函数(FileStream()),这会导致一个未真正初始化的基类。 IsolatedStorageFileStream创建一个FileStream实例,并在它覆盖的所有方法中使用它(Write,Read,Flush,Seek等)。奇怪的是它没有直接利用它的基类。

但是不会覆盖Lock和Unlock,并且它们需要一个仍为null的私有字段(_handle)(因为使用的构造函数是无参数的)。他们假设它是非空的并且取消引用它并导致NRE。

总而言之,不支持锁定和解锁(或错误)。

我猜你被迫使用其他锁定方法,比如Mutex或Semaphore。

.NET 4 RC中的实现是相同的。在Silverlight中,Lock an Unlock根本不存在(我为与MVP相矛盾道歉)。

答案 1 :(得分:0)

尝试使用大于0的值来锁定数据量。此外,流中是否有任何数据,如果没有什么可以锁定可能是问题....

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