2

一部のデータをファイルに保存しようとしていますが、このファイルはさまざまな方法で複数回アクセスされているため、アクセス拒否エラーが発生します。次のメソッドにロックを適用してファイルにアクセスするにはどうすればよいですか?

コード:

public static async Task SaveDataToFileAsync<T>(string key, T value, bool roaming = false, Type[] extraTypes = null)
{
    var file = roaming ? await KnownFolders.DocumentsLibrary.CreateFileAsync(key + ".xml", CreationCollisionOption.ReplaceExisting) :
    await KnownFolders.DocumentsLibrary.CreateFileAsync(key + ".xml", CreationCollisionOption.ReplaceExisting);

    var xml = Xml.Serialize<T>(value, extraTypes);
    await FileIO.WriteTextAsync(file, xml, UnicodeEncoding.Utf8);
}

public static async Task<T> GetdataFromFileAsync<T>(string key, T defaultValue, bool roaming = false, Type[] extraTypes = null)
{
    var file = roaming ? await KnownFolders.DocumentsLibrary.CreateFileAsync(key + ".xml", CreationCollisionOption.OpenIfExists) :
    await KnownFolders.DocumentsLibrary.CreateFileAsync(key + ".xml", CreationCollisionOption.OpenIfExists);

    var xml = await FileIO.ReadTextAsync(file, UnicodeEncoding.Utf8);
    return !String.IsNullOrEmpty(xml) ? Xml.Deserialize<T>(xml, extraTypes) : defaultValue;
}
4

1 に答える 1

1

SemaphoreSlimまたはStephenToubのAsyncLockを使用できます。AsyncExライブラリの一部AsyncLockとしても利用できます。

の例を次に示しAsyncLockます。これは、以下よりも自然な構文を持っていますSemaphoreSlim

private static AsyncLock mutex = new AsyncLock();
public static async Task SaveDataToFileAsync<T>(string key, T value, bool roaming = false, Type[] extraTypes = null)
{
  using (await mutex.LockAsync())
  {
    var file = roaming ? await KnownFolders.DocumentsLibrary.CreateFileAsync(key + ".xml", CreationCollisionOption.ReplaceExisting) :
    await KnownFolders.DocumentsLibrary.CreateFileAsync(key + ".xml", CreationCollisionOption.ReplaceExisting);

    var xml = Xml.Serialize<T>(value, extraTypes);
    await FileIO.WriteTextAsync(file, xml, UnicodeEncoding.Utf8);
  }
}
于 2013-01-24T17:09:16.740 に答える