所以我试图在我的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或完整版本中使用。
答案 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);