UWP — Не удается удалить файл — Блокировка файла

#c# #file #uwp #async-await #storage

#c# #файл #uwp #асинхронный — ожидание #Хранение

Вопрос:

У меня была проблема с ‘RandomAccessStream.CopyAndCloseAsync()’ который не смог загрузить некоторые файлы из-за некоторых проблем с брандмауэром (как я предполагаю). Мне нужно было найти решение, чтобы отменить загрузку, и я придумал это.

         await Task.Run(() =>
        {
            Task.Run(async () =>
            {
                await RandomAccessStream.CopyAndCloseAsync(inputStream, outputStream);
            }).Wait(cancelDownload.Token);
        });
        inputStream.Dispose();
        outputStream.Dispose();
 

Когда загрузка происходит с ошибками, файл должен быть удален. Это то, что я использую:

     async public Task DeleteFileAsync(string filename)
    {
        StorageFolder folder = await App.GetDocumentFolder();
        try
        {
            var file = await folder.GetFileAsync(filename);
            await file.DeleteAsync(StorageDeleteOption.PermanentDelete);
        }
        catch (System.IO.FileNotFoundException e)
        {
            Log.Warn(e.Message)
        }
    }
 

Теперь самое странное, что файл не удаляется. В то же время мой код не переходит в часть «улова».

НО файл удаляется ПОСЛЕ закрытия приложения UWP.

Я предполагаю, что ‘await RandomAccessStream.CopyAndCloseAsync(InputStream, OutputStream);’ блокирует файл, чтобы я не мог его удалить ?!

Есть ли какие-либо возможности снять эту блокировку файла? Может быть, мне нужно что-то другое, кроме ‘.Dispose()’ ?

Комментарии:

1. Пожалуйста, вызовите CopyAndCloseAsync as task и дайте ему токен, например await RandomAccessStream.CopyAndCloseAsync(inputStream, outputStream).AsTask(cancelDownload.Token);

2. @NicoZhu-MSFT попробовал. Я создал byteobserver для этого файла. Размер файла остается равным 0 байтам. Моя загрузка CancelDownload. Токен отменяется, но мое приложение UWP застряло в ‘await RandomAccessStream. CopyAndCloseAsync()’ до завершения загрузки (чего никогда не будет)

3. Почему вы оборачиваете двойную задачу для CopyAndCloseAsync метода?

4. @NicoZhu-MSFT Асинхронная задача необходима, чтобы я мог отменить зависшую загрузку и продолжить загрузку следующего файла. Задача синхронизации необходима, чтобы мой пользовательский интерфейс не зависал

5. Не могли бы вы поделиться с нами образцом, я протестирую и отредактирую базу на вашей демо-версии.