4

そのため、アプリケーションの複数のコピーが同時にアクセスできないように、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 またはフル リリースで利用できるようになるはずです。

4

2 に答える 2

4

これはフレームワークのバグのようです。あまりにも大きすぎて真実ではないので、私は間違っているかもしれません。

Reflector を使用した .NET 3.5 SP1 のソース コードを見ると、IsolatedStorageFileStream がパラメーターなしの基本コンストラクター (FileStream()) を呼び出していることがわかります。これにより、実際には初期化されていない基本クラスが生成されます。IsolatedStorageFileStream は FileStream のインスタンスを作成し、オーバーライドするすべてのメソッド (書き込み、読み取り、フラッシュ、シークなど) でそれを使用します。基本クラスを直接利用しないのは奇妙です。

ただし、Lock と Unlock はオーバーライドされず、null のままのプライベート フィールド (_handle) が必要です (使用されるコンストラクターがパラメーターなしのコンストラクターであるため)。彼らはそれが非nullであると想定し、逆参照してNREを引き起こします。

要約すると、Lock と Unlock はサポートされていません (またはバグがあります)。

Mutex や Semaphore などの他のロック方法を使用する必要があると思います。

実装は .NET 4 RC でも同じです。Silverlight では、Lock and Unlock はまったく存在しません (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 に答える