全新文件中的UWP“文件使用错误”

时间:2018-01-16 03:51:46

标签: c# uwp

在我的一个UWP应用程序中,我有一些间歇性的异常将文本写入一个全新的文件。示例代码看起来像

var myFolder = await GetFolder("MyFolderName");
var fileName = $"{random}-{DateTime.Now.ToString("yyyyMMddHHmmss")}.xml";
var myFile = await myFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(myFile, "some content");

private static async Task<StorageFolder> GetFolder(string folderName)
{
    var storageFolder = ApplicationData.Current.LocalFolder;

    var possibleFolder = await storageFolder.TryGetItemAsync(folderName);
    if (possibleFolder == null)
    {
        await storageFolder.CreateFolderAsync(folderName);
    }

    var folder = await storageFolder.GetFolderAsync(folderName);

    return folder;
}

使用以下详细信息在行await FileIO.WriteTextAsync(myFile, "some content");上抛出异常

  

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

     

该文件正在使用中。请在继续之前关闭文件。在   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)在System.Runtime.CompilerServices.TaskAwaiter.GetResult()
  在MyClass。&lt;&gt; c__DisplayClass6_0。&lt; b__0&gt; d.MoveNext()

我真的不明白,如何使用全新的文件?

1 个答案:

答案 0 :(得分:0)

我已经在一个空白项目中测试了你的代码,它完全正常。

是否有可能一次从多个线程调用此方法?如果是,您应该考虑使用Semaphorelock来阻止多个线程一次访问该部分。

此外,random可能不是完全随机的。如果同时创建Random类的多个实例,则很可能在首次查询时获得相同的值,因为它只是伪随机的。最好的方法是只创建一个共享的类实例。

放在一起:

private static Random _randomizer = new Random();

public async Task CreateFileAsync()
{        
    var random = 0;
    lock ( _randomizer )
    {
       random = _randomizer.Next();
    }

    var myFolder = await GetFolder("MyFolderName");
    var fileName = $"{random}-{DateTime.Now.ToString("yyyyMMddHHmmss")}.xml";
    var myFile = await myFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
    await FileIO.WriteTextAsync(myFile, "some content");

    async Task<StorageFolder> GetFolder(string folderName)
    {
        var storageFolder = ApplicationData.Current.LocalFolder;

        var possibleFolder = await storageFolder.TryGetItemAsync(folderName);
        if (possibleFolder == null)
        {
            await storageFolder.CreateFolderAsync(folderName);
        }

        var folder = await storageFolder.GetFolderAsync(folderName);

        return folder;
    }            
}