在我的一个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()
我真的不明白,如何使用全新的文件?
答案 0 :(得分:0)
我已经在一个空白项目中测试了你的代码,它完全正常。
是否有可能一次从多个线程调用此方法?如果是,您应该考虑使用Semaphore
或lock
来阻止多个线程一次访问该部分。
此外,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;
}
}