C# .NET隔离存储文件锁定引发NRE

C# .NET隔离存储文件锁定引发NRE,c#,.net,silverlight,isolatedstorage,filelock,C#,.net,Silverlight,Isolatedstorage,Filelock,因此,我试图在我的C#客户端应用程序中锁定一个独立的存储文件,以便我的应用程序的多个副本不能同时访问它。我使用以下语法: lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore); lockStream.Lock(0, 0); 这段代码导致我的应用程序从框架的FileStream.Lock方法内部抛出NullReferenceException。我已经尝试使用非零值作为长度。我曾尝

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

lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore);
lockStream.Lock(0, 0);
这段代码导致我的应用程序从框架的FileStream.Lock方法内部抛出NullReferenceException。我已经尝试使用非零值作为长度。我曾尝试将一个字节写入文件,然后仅锁定该字节。无论我做什么,同样的NullReferenceException总是困扰着我。有人知道隔离存储是否可以做到这一点吗

另外,我正在研究在Silverlight应用程序中使用此技术,Silverlight是否支持文件锁定?MSDN文档似乎表明它没有,但我从一个C#MVP上看到它有


更新:微软已经修复了我在Connect上提交的bug,但它没有在框架的第4版中发布。它有望在下一个SP或完整版本中可用。

尝试将要锁定的数据量设置为大于0的值。此外,流中是否有任何数据,如果没有要锁定的数据,则可能是问题所在

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

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

查看带有Reflector的.NET 3.5 SP1的源代码,可以发现IsolatedStorageFileStream调用了无参数基类构造函数(FileStream()),这导致基类没有真正初始化。IsolatedStorageFileStream创建FileStream的实例,并在其覆盖的所有方法(写入、读取、刷新、查找等)中使用它。奇怪的是,它没有直接利用它的基类

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

总之,不支持锁定和解锁(或bug)

我猜您必须使用其他锁方法,如互斥锁或信号量


在.NET4RC中的实现是相同的。在Silverlight中,锁定解锁根本不存在(很抱歉与MVP冲突)。

我还尝试了以下方法:lockStream=new-IsolatedStorageFileStream(“my.lck”,FileMode.OpenOrCreate,isoStore);lockStream.WriteByte(0xFF);lockStream.Lock(0,1);这完全是以同样的方式失败的。我只是在做一个基本的IsolatedStorageFile isoStore=IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly,null,null);谢谢,我看了反射器,我很确定你是对的。我已经在Connect上提交了一个bug,请随意投票:我能够通过使用反射在IsolatedStorageFileStream的私有“m_fs”字段上调用Lock方法来解决这个bug,如下所示:lockStream=new IsolatedStorageFileStream(“q.lck”,FileMode.OpenOrCreate,isoStore);FileStream m|fs=typeof(IsolatedStorageFileStream)。调用成员((“m|fs”),BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance,null,lockStream,null)作为文件流;m_fs.Lock(0,long.MaxValue);