FileLoadException: файл используется - PullRequest
0 голосов
/ 16 апреля 2019

Моя задача - записать данные, поступающие от датчика 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(), чтобы записать состояние камеры Хололенса в файл.Поскольку Update() не является асинхронным, я не могу позвонить await WriteData().

1 Ответ

0 голосов
/ 16 апреля 2019

Вы должны использовать блокировку, чтобы гарантировать, что только один поток записывает файл в данный момент времени так:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...