UWP - прочитать файл и иметь возможность отменить воспроизведение / открытие - PullRequest
0 голосов
/ 07 мая 2020

Примечание. Я использую приложение для перевода. Извините, если это не всегда очень понятно.

Я разрабатываю приложение UWP, и у меня возникла проблема с управлением типом файла, расширением CBZ. Некоторые файлы открываются без проблем, другие файл никогда не открывается и блокирует задачу.

Вот код, который я использую:

Task loadEbookTask = Task.Factory.StartNew(() =>
{
    Stream streamEbook = WindowsRuntimeStorageExtensions.OpenStreamForReadAsync(ebookFile).Result;

    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
    Content = new ZipArchive(streamEbook, ZipArchiveMode.Read, false);

        // Pour charque archive, prendre que des extensions valident.
        foreach (var file in Content.Entries)
    {
        string extension = Path.GetExtension(file.Name).ToLower();
        bool isFileExtensionOk = EbooksManager.AvailableExtensionsImage.Contains(extension);

        if (isFileExtensionOk)
        {
            ArchivesExploitable.Add(file);
        }
    }

    TotalPage = Convert.ToUInt32(ArchivesExploitable.Count());
});

if (loadEbookTask.Wait(4000))
{
    EbookCbz.LoadEbook = EbookLoad.Ok;
}
else
{
    EbookCbz.LoadEbook = EbookLoad.Timeout;
}

Он зацикливается:

Stream streamEbook = WindowsRuntimeStorageExtensions.OpenStreamForReadAsync(ebookFile).Result;

В Visual Studio память go больше не увеличивается, но сборщик мусора продолжает вызываться. С Task.Wait (4000) он не останавливает Task, поэтому он не перестает работать в фоновом режиме. И если я открою другой файл, будет создана новая задача, которая превратится в фоновую.

Мой вопрос: - Есть ли метод, открывающий файл, и что его можно отменить, если он превышает определенное время.

1 Ответ

0 голосов
/ 08 мая 2020

Именно этот метод вызывает проблемы c.

Stream streamEbook = WindowsRuntimeStorageExtensions.OpenStreamForReadAsync(ebookFsile).Result;

Я меняю свой код на:

byte[] buffer = await ebookFile.ReadBytesAsync();
Stream stream = new MemoryStream(buffer);

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Content = new ZipArchive(stream, ZipArchiveMode.Read, false);

Это быстро, и если файл поврежден, возникает исключение . Его больше нет в памяти. Спасибо за вашу помощь, я узнал новую концепцию.

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