1

XML マニフェストに書き込むカスタマイズされたアプリ (そのソースは私たちの管理下にありません) の進行状況を監視しています。マニフェスト ファイルに書き込めないために、アプリケーションが停止することがあります。File.Close を使用してファイル ハンドルを明示的に閉じ、ブロックの使用でファイル変数を作成することで、トレースをカバーしていますが。しかし、どういうわけかそれは起こり続けます。(私たちのアプリケーションはマルチスレッド化されており、最大で 3 つのスレッドがファイルにアクセスしている可能性があります。) もう 1 つの興味深い点は、彼らのアプリが 3 つの異なるイベント (項目の追加、項目の削除、項目の完了) でこのマニフェストを更新することですが、私たちが苦しんでいるのは 1 つのイベントだけです。 (アイテムの完成)。私のコードはここにリストされています

using (var st = new FileStream(MenifestPath, FileMode.Open, FileAccess.Read))
{
    using (TextReader r = new StreamReader(st))
    {
       var xml = r.ReadToEnd();
           r.Close();
           st.Close();
          //................ Rest of our operations
    }
}
4

5 に答える 5

2

ファイルから読み取るだけの場合は、フラグを渡して共有モードを指定できるはずです。.NETでこれをどのように指定するかはわかりませんが、WinAPIでは。に渡しFILE_SHARE_READ | FILE_SHARE_WRITEますCreateFile()

ファイルAPIのドキュメントをチェックして、共有モードについて言及されている場所を確認することをお勧めします。

于 2008-10-20T12:29:41.180 に答える
1

2つのこと:

  1. 残りの操作は、usingステートメントの範囲外で行う必要があります。このように、クローズドストリームとリーダーを使用するリスクはありません。また、ステートメントCloseのスコープを終了すると、が呼び出されるため、メソッドを使用する必要はありません。これは同等です。usingDispose
  2. FileShare列挙型のオーバーロードを使用する必要があります。ロックは本質的に妄想的であるため、自分自身から保護するためにファイルが自動的にロックされる場合があります。:)

HTH。

于 2008-10-20T12:50:30.577 に答える
0

また、.NET 2.0 以降を使用している場合は、コードを次のように単純化できます。

string xmlText = File.ReadAllText(ManifestFile);

MSDN の File.ReadAllTextも参照してください。

于 2008-10-20T23:56:16.957 に答える
0

私が言及したように、その人はすべてのプロセスのファイルアクセスを完全に制御しているため、問題は異なります。1つのプロセスはソースアクセスなしのサードパーティです。そして、私たちのアプリケーションは正常に動作しています。ただし、ファイルの制御を取得できない場合、アプリケーションはスタックしているように見えます。そのため、実行を妨げないファイル アクセスの方法を見つけたいと思っています。

于 2008-10-20T11:54:28.613 に答える
0

これは、あるスレッドが書き込み中に別のスレッドがファイルから読み取ろうとした場合に発生する可能性があります。複数のリーダーが必要で、一度に 1 つのライターのみが必要なこのような状況を回避するには、ReaderWriterLock を使用するか、.NET 2.0 では System.Threading 名前空間の ReaderWriterLockSlim クラスを使用します。

于 2008-10-20T21:12:44.977 に答える