首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FileLoadException:文件正在使用中

FileLoadException:文件正在使用中
EN

Stack Overflow用户
提问于 2019-04-16 17:29:00
回答 1查看 397关注 0票数 -1

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

代码语言:javascript
复制
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();
    }

}

但我总是得到:

代码语言:javascript
复制
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次。但我不知道如何修复它。

编辑: more details。我把this example带走了。有一个类SpatialMappingObserver,它有一个Update()方法,它每秒被调用30次。在那里我调用我的WriteData()在文件中写入全息相机的状态。因为Update()不是异步的,所以我不能调用await WriteData()

EN

回答 1

Stack Overflow用户

发布于 2019-04-16 17:36:19

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

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55704858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档