4

アプリケーションには、同じファイルに対して XmlWriter.Create を呼び出す複数の場所があり、すべて次の関数を介してアクセスされます。書き込み中に別の呼び出しを行うと、IOException が発生します。アクセスをロックまたは同期する最良の方法は何ですか?

使用されている関数は次のとおりです。

        public void SaveToDisk()
    {
        try
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            using (XmlWriter writer = XmlWriter.Create(SaveFileAbsolutePath, settings))
            {
                XamlWriter.Save(this, writer);
                writer.Close();
            }

        }
        catch (Exception ex)
        {
            // Log the error
            System.Diagnostics.Debug.WriteLine(ex.Message);

            // Rethrow so we know about the error
            throw;
        }
    }

更新: 問題はこの関数の呼び出しだけではないようですが、この関数の書き込み中に別のスレッドがファイルを読み取っているためです。読み取り中にファイルに書き込もうとしないようにロックする最善の方法は何ですか?

4

3 に答える 3

4

ロックを使用すると、同時実行の問題を解決してIOExceptionを回避できますが、SaveToDiskとReadFromDiskのいずれかで同じオブジェクトを使用することを忘れないでください(これは読み取り関数だと思います)。そうしないと、読み取り時にのみロックすることはまったく役に立ちません。

private static readonly object syncLock = new object();

public void SaveToDisk()
{
     lock(syncLock)
     {
          ... write code ...
     }
}

public void ReadFromDisk()
{
     lock(syncLock)
     {
          ... read code ...
     }
}
于 2009-01-14T16:29:41.960 に答える
3

静的ロックは、迅速かつ簡単にジョブを実行する必要があります。

private static readonly object syncLock = new object();

それから...

public void SaveToDisk()
{
    lock(syncLock)
    {
        ...your code...
    }
}

[MethodImpl(MethodImplOptions.Synchronized)](インスタンスを引数として受け入れる静的メソッドで - たとえば、拡張メソッドで) を使用することもできますが、明示的なロックの方が用途が広いです。

于 2009-01-14T08:08:39.147 に答える
1

実際にはReaderWriterLockを使用して同時実行性を最大化します。複数のリーダーを許可できますが、一度に許可できるライターは 1 つだけです。

private ReaderWriterLock myLock = new ReaderWriterLock();

public void SaveToDisk()
{
     myLock.AcquireWriterLock();
     try
     {
          ... write code ...
     } 
     finally
     {
          myLock.ReleaseWriterLock();
     }
}

public void ReadFromDisk()
{
     myLock.AcquireReaderLock();
     try
     {
          ... read code ...
     } 
     finally
     {
          myLock.ReleaseReaderLock();
     }
}

後続の読み取りが失敗しないように、必ずFileShare.Readでファイルを開いてください。

于 2011-02-14T13:35:07.013 に答える