UWP StorageFile文件正在被另一个进程错误使用

时间:2018-03-13 19:21:29

标签: uwp storagefile

我的应用程序的数据存储在本地JSON中。我最初将其存储为字符串应用程序设置,但这并没有提供足够的空间。所以,我正在更新我的应用程序以从本地存储中的JSON文件读取/写入。

当用户与我的应用互动时,我的应用会在不同时间读取和写入JSON,并且在阅读或写入文件时我会收到很多错误:

  

System.IO.FileLoadException:'进程无法访问该文件   因为它正被另一个进程使用。'

以下是涉及的方法:

    private static async Task<StorageFile> GetOrCreateJsonFile()
    {
        bool test = File.Exists(ApplicationData.Current.LocalFolder.Path + @"\" + jsonFileName);

        if(test)
            return await ApplicationData.Current.LocalFolder.GetFileAsync(jsonFileName);
        else
            return await ApplicationData.Current.LocalFolder.CreateFileAsync(jsonFileName);

    }


    private static async void StoreJsonFile(string json)
    {
        StorageFile jsonFile = await GetOrCreateJsonFile();
        await FileIO.WriteTextAsync(jsonFile, json);
    }

    private static async Task<string> GetJsonFile()
    {
        StorageFile jsonFile = await GetOrCreateJsonFile();
        return await FileIO.ReadTextAsync(jsonFile);
    }

有时错误发生在WriteTextAsync,有时是ReadTextAsync。似乎并不是发生错误的特定点,似乎是随机发生的。如果有其他方法可以避免错误,请告诉我。

1 个答案:

答案 0 :(得分:2)

问题出在您的StoreJsonFile方法中。它标记为async void,这是一种不好的做法。当您调用此方法并且它到达第一个IO绑定async调用(在本例中为FileIO.WriteTextAsync)时,它将结束执行并且不会等待IO操作完成。这是一个问题,因为当您调用GetJsonFile时,该文件可能正在使用(或者甚至可能尚未创建)。此外 - 当ReadTextAsync已经开始执行时,写入可能无法启动,因为系统首先运行该方法。这就解释了为什么你可能会在两种方法中看到异常。

解决方案非常简单 - 请勿使用async void并使用async Task代替:

private static async Task StoreJsonFile(string json)
{
    StorageFile jsonFile = await GetOrCreateJsonFile();
    await FileIO.WriteTextAsync(jsonFile, json);
}

当你调用你的方法时,总是记得使用await来确保在IO操作完成后继续执行,这样就不存在竞争条件的风险。