質問

そのため、C#クライアントアプリケーションで孤立したストレージファイルをロックしようとしているため、アプリケーションの複数のコピーが同時にアクセスできません。次の構文を使用しています。

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

このコードにより、私のアプリケーションは、FileStream.Lockメソッドの内側からnullReReferenceExceptionをスローします。長さにゼロ以外の値を使用してみました。ファイルにバイトを書き、そのバイトをロックしてみました。私が何をしても、その同じnullReferenceExceptionは私を悩ませ続けます。孤立したストレージでこれが可能かどうか誰か知っていますか?

また、Silverlightアプリケーションでもこの手法を使用することを検討していますが、Silverlightはファイルロックをサポートしていますか? MSDNドキュメントはそうではないことを示しているようですが、私は見ました この郵便受け それがそうであると言うC#MVPから。

更新:MicrosoftはConnectで提出したバグを修正しましたが、フレームワークのバージョン4ではリリースされていません。次のSPまたはフルリリースで利用できるはずです。

役に立ちましたか?

解決

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

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

ただし、ロックとロック解除はオーバーライドされておらず、まだnullであるプライベートフィールド(_handle)が必要です(使用されるコンストラクターはパラメーターレスのものです)。彼らはそれが非ヌルであり、それを繰り返し、NREを引き起こすと仮定します。

要約、ロック、ロック解除はサポートされていません(またはバギー)。

MutexやSemaphoreなどの他のロックメソッドを使用することを余儀なくされていると思います。

実装は.NET 4 RCで同じです。 Silverlightでは、ロック解除はまったく存在しません(MVPと矛盾したことで謝罪します)。

他のヒント

ロックするデータの量に対して0を超える値を試してみてください。また、ロックするものが何もない場合、それが問題になる可能性がある場合、ストリームにデータはありますか。

 lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore);
 lockStream.Write(.....)
 lockStream.Lock(0, 10);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top