0

一連のフォルダーをスキャンし、それらのすべての XML ファイルを見つけ、それらを読み込んで有効性に関する最初の基本的なチェックを実行し、DB にインポートしようとする UI インポート ツールをコーディングしました (これにより、別のさらに大きな有効性の束が発生します)。チェックを実行します)。基本的なチェックまたはインポートが失敗すると、アプリは詳細なエラー メッセージをユーザーに表示するので、ユーザーはそれぞれの XML ファイルを開いて編集できます。しかし...ファイルは「別のプロセスで使用されている」ため、ユーザーはファイルを保存できません。

その段階で、すべてのインポーター オブジェクトはなくなってしまいましたが、まだガベージ コレクションが行われていないのではないかと考えたので、XML ファイルへのハンドルを開いたままにしています。そのため、チェック/インポートプロセスの後に GC.Collect() を試してみると、魔法のようにユーザーは XML ファイルを編集して保存できます。

私のコードがこれまでに XML ファイルで行ったことは次のとおりです。

XmlReader reader = XmlReader.Create(m_xmlInputFile);
m_XmlDocument = new XmlDocument();
m_XmlDocument.Load(reader);

「reader」はローカル変数なのですぐにスコープ外になり、m_XmlDocument はインポーター オブジェクトが生きている限り存続するメンバー変数です。インポーター オブジェクトは別の関数のローカル変数であるため、すべてが完了した後は、すべてが死刑になるはずです。それでも、死刑囚を待つには時間がかかりそうです...

私の場合はそれほど重要ではありませんが、好奇心から、(GC を強制する以外に) ディスク上の XML ファイルを「解放」するためにできることがあるかどうかを知りたいと思います。 /彼女の驚きのない編集。

ありがとう

4

1 に答える 1

1

XmlReader実装IDisposableし、契約の終了を遅らせていません。

適切なタイミングでそれを呼び出すか、(より良い)ブロックDisposeでそれを使用するコードを囲みます。using

using(XmlReader reader = XmlReader.Create(m_xmlInputFile))
{
    m_XmlDocument = new XmlDocument();
    m_XmlDocument.Load(reader);
}

ガベージ コレクションを強制している場合は、何か間違ったことをしています(99.99% の確率で)。

参照がスコープ外に出ても魔法のようなことは何も起こりません - そうです、それが参照するオブジェクトはガベージ コレクションの対象になります (それがオブジェクトへの最後の残りの参照であった場合) が、余分なコードは実行されません。

一方、オブジェクトがリソースを保持していて、できるだけ早くクリーンアップする必要がある場合は、使い捨てパターンを実装します。

于 2012-06-07T09:04:59.587 に答える