c# - FileLoadException:文件正在使用中
问题描述
我的任务是将每秒 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 Camera 的状态。因为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。
推荐阅读
- c++ - Flutter/Dart“UInt8List”的源代码在哪里看
- python - 如何使用 Selenium Python 下载具有“数据:图像”类型源的图像
- css - css:如何使 iframe 像 div 一样?
- reactjs - 无法使用 React 解析打字稿模块
- sql - 表达式中未定义的函数“PlainText”
- c - 为什么 C 中的这个 regexec() 不应该作为匹配返回?
- php - 有谁知道为什么我的 mysql 表没有更新?
- ios - Swift4 中的正则表达式来验证全名
- python - 使用 AWS 放大时出现 502 网关错误,cloudwatch 在随机线路上给出错误?
- java - 为来自子类的基类日志消息添加前缀