4

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

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

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

此外,我也在研究在 Silverlight 应用程序中使用这种技术,Silverlight 是否支持文件锁定?MSDN 文档似乎表明它没有,但我从 C# MVP 中看到这篇文章说它有。

更新:微软已经修复了我在 Connect 上提交的错误,但它并未在框架的第 4 版中发布。它应该有望在下一个 SP 或完整版本中提供。

4

2 回答 2

4

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

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

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

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

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

The implementation is the same in .NET 4 RC. In Silverlight, Lock an Unlock are not present at all (my apologies for contradicting an MVP).

于 2010-03-04T22:55:25.247 回答
0

尝试为要锁定的数据量设置一个大于 0 的值。此外,流中是否有任何数据,如果没有任何要锁定的内容可能是问题......

 lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore);
 lockStream.Write(.....)
 lockStream.Lock(0, 10);
于 2010-03-04T22:25:31.890 回答