文件加载异常:文件正在使用中

  • 本文关键字:文件 加载 异常 c# uwp
  • 更新时间 :
  • 英文 :


我的任务是将每秒来自传感器 30 次的数据写入.csv文件。如果 sersor 发送了错误的数据,我不会写它,只是等待。如果数据再次正常,我需要创建一个新文件并开始在那里写入数据。这是我的代码:

class FileWriter
{
string filename;
public FileWriter()
{
}
public void SetFilename(string filename)
{
this.filename = filename;
}
public async void WriteData(string data)
{
StorageFile file = await KnownFolders.PicturesLibrary.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
var stream = await file.OpenAsync(FileAccessMode.ReadWrite);
using (var outputStream = stream.GetOutputStreamAt(stream.Size))
{
using (var dataWriter = new Windows.Storage.Streams.DataWriter(outputStream))
{
dataWriter.WriteString(data);
await dataWriter.StoreAsync();
}
await outputStream.FlushAsync();
}
stream.Dispose();
}
}

但我总是得到:

Exception thrown: 'System.IO.FileLoadException' in 
System.Private.CoreLib.ni.dll
WinRT information: The file is in use. Please close the file before continuing.
FileLoadException: The process cannot access the file because it is being used by another process.

我认为,这是因为文件异步打开并且每秒没有时间打开 30 次。但我不知道如何解决它。

编辑:更多详细信息。 我举了这个例子。有一个类SpatialMappingObserver,它有一个方法Update(),每秒调用30次。在那里,我打电话给我的WriteData(),将Hololens相机的状态写入文件中。因为Update()不是异步的,所以我不能调用await WriteData()

您应该使用锁来确保只有一个线程在给定时间写入文件,如下所示:

class FileWriter
{
static readonly object _filelock = new object();
string filename;
public FileWriter()
{
}
public void SetFilename(string filename)
{
this.filename = filename;
}
public async void WriteData(string data)
{
lock (_filelock) 
{
StorageFile file = await KnownFolders.PicturesLibrary.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists);
using(var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
using (var outputStream = stream.GetOutputStreamAt(stream.Size))
{
using (var dataWriter = new Windows.Storage.Streams.DataWriter(outputStream))
{
dataWriter.WriteString(data);
await dataWriter.StoreAsync();
}
await outputStream.FlushAsync();
}
}
}
}
}

另外,我认为您的CreationCollisionOption必须设置为OpenIfExists。

最新更新