1

このオープンソースライブラリがあり、問題の修正に問題があります...このライブラリを使用すると、アプリケーション設定を保存するためのXMLファイルを簡単に作成できます。しかし、変更の保存に問題があります。

このライブラリを使用している別のアプリケーションがあり、そのアプリケーションウィンドウのサイズ変更が完了するたびに、ライブラリのSave()メソッドを呼び出して、ウィンドウのサイズ/位置をXMLファイルに保存します。

ほとんどの場合、正常に動作し、すべてが保存されます。ただし、ファイルが別のプロセスで使用されているという例外が発生することがあります。

Save()メソッドが呼び出されるたびに変更が保存されることを確認する必要があります。この例外を何らかの方法で処理するか、発生しないようにする必要があります。

この状況を最もうまく処理するための皆さんの提案は何ですか?

Save()メソッドのコードは次のとおりです。

public void Save() {
    // Create a new XML file if there's no root element
    if(xDocument.DocumentElement == null) {
        xDocument = new XmlDocument();
        xDocument.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" +
            "<" + XmlRootElement + ">\n</" + XmlRootElement + ">");
    }

    // OMITTED CODE WAS HERE (NOT IMPORTANT FOR THE PROBLEM)

    // Create a new XML writer for the XML file
    XmlWriter xWriter = XmlWriter.Create(XmlFilePath, new XmlWriterSettings() {
        Indent = true,
        IndentChars = "\t"
    });

    // Sort the XML file using the XSL sylesheet and save it
    xslTransform.Transform(xDocument, xWriter);

    // Clear the buffer and close the XML writer stream
    xWriter.Flush();
    xWriter.Close();
}
4

4 に答える 4

3

XmlWriterはIDisposableです。using()句でラップする必要があります。 http://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx

于 2009-05-11T19:14:17.253 に答える
2

私はすでにここで与えられた答えの組み合わせで行かなければなりません。

XmlWriterは、いくつかの理由でusingブロックにある必要があります。リソースができるだけ早く解放されるように廃棄する必要があります。また、操作中に例外をスローした場合はどうなりますか。少なくともファイナライザーが起動してリソースを解放するまで、ファイルは適切に閉じられません。

usingステートメントを使用しても、ファイルで競合が発生する可能性があり、Saveコードをlockステートメントに配置する必要があります。ファイルは共有リソースであるため、このメソッドは本質的に再入可能ではありません。複数のスレッドがない場合、その周りにロックをかけると過剰に殺される可能性がありますが、ファイルへのアクセスを適切に制御することを保証します。

考慮すべきもう1つのことは、保存操作をバックグラウンドスレッドに移動して、ファイルを書き出すことです。大きな設定ファイルを取得すると、ユーザーがサイズを変更するたびにファイルの書き込みを待機しているため、奇妙なUIインタラクションが発生する可能性があり、これはUIスレッドで発生します。これを行った場合は、ファイルリソースへのアクセスを確実にロックする必要があります。

于 2009-05-11T21:38:47.157 に答える
1

また、lockステートメントを使用してみてください。メソッドが互いにオーバーランしている可能性があります。

于 2009-05-11T19:15:43.600 に答える
1

window-resizing-completedイベントが非常に高速に発生しているため、save関数が呼び出され、最初の実行が終了する前に再度呼び出される場合があります。これにより、説明しているエラーが発生します(ファイルを使用する他のプロセスは... YOU!です)。 コードをロックで囲んでみてください。つまり、次のようになります

lock(some_shared_object)
{
    //Your code here
}
于 2009-05-11T19:48:29.707 に答える