CreateQueryWithOptions вызывает системное взаимодействие Com исключения

Итак, у меня есть простое приложение UWP, где я пытаюсь получить данные из KnownFolders.VideoLibrary и чтобы сделать это быстрее, я использую индексирование с QueryOptions. Как ни странно, при первой загрузке страницы я не получаю никакой ошибки, но когда я пытаюсь перейти в другую папку и снова перейти на ту же страницу, я получаю это исключение Com

Ошибка имеет тип System.Runtime.InteropServices.COMException

Ошибка HRESULT E_FAIL была возвращена из вызова к компоненту COM

Метод FillFolders в моей ViewModel**

private async Task FillUpFolders()
    {
        uint index = 0, stepSize = 5;
        //on the first load of the LibraryPage I dont get any exception
        //but on the 2nd load, I get exception on the line below.
        var VideoQuery = FileHelper.GetVideoFoldersQuery(MainFolder, 200);
        IReadOnlyList<StorageFolder> folders = await VideoQuery.GetFoldersAsync(index, stepSize);
        index += 5;
        while (folders.Count != 0)
        {
            var folderTask = VideoQuery.GetFoldersAsync(index, stepSize).AsTask();
            foreach (StorageFolder folder in folders)
            {
                var vv = new Folder
                {
                    MyStorageFolder = folder,
                    Title = folder.DisplayName,
                    Thumbnail = new BitmapImage(new Uri("ms-appx:///Assets/FolderIcon.png")),
                    MyStretch = Windows.UI.Xaml.Media.Stretch.Uniform
                };
                Source.Add(vv);
            }
            folders = await folderTask;
            index += 5;
        }
    }

Метод запроса видеофайлов

internal static StorageFolderQueryResult GetVideoFoldersQuery(StorageFolder Folder, uint thumbnailRequestedSize)
    {
        if (videoFolderOptions is null)
        {
            videoFolderOptions = new QueryOptions(CommonFolderQuery.DefaultQuery)
            {
                IndexerOption = IndexerOption.OnlyUseIndexerAndOptimizeForIndexedProperties//check sort order later               
            };
            videoFolderOptions.SetThumbnailPrefetch(ThumbnailMode.VideosView, thumbnailRequestedSize, ThumbnailOptions.UseCurrentScale);
        }
        return Folder.CreateFolderQueryWithOptions(videoFolderOptions);
    }

Я предоставляю свой проект на репозитории github, чтобы любой мог легко воспроизвести проблему и легко ее проанализировать.

https://github.com/touseefbsb/UWPStorageFolderBug

Трассировки стека

" at Windows.Storage.StorageFolder.CreateFolderQueryWithOptions(QueryOptions queryOptions)\r\n в Fluent_Video_Player.Helpers.FileHelper.GetVideoFoldersQuery(папка StorageFolder, UInt32 thumbnailReeNews_Mode.Ill.RD \n--- Конец трассировки стека от предыдущего местоположения, где было сгенерировано исключение ---\r\n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Задача) \ r \ n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Задача) \ r \ n в System.Runtime.CompilerServices.TaskAwaiter.GetResult()\r\n в Fluent_Video_Player.ViewModels.LibraryViewModel.d__9.MoveNext()\r\ from из предыдущего конца место, где было сгенерировано исключение ---\r\n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача задачи) \ r \ n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) \ r \ n в системе.Runtime.CompilerServices.TaskAwaiter.GetRes ult () \ r \ n в Fluent_Video_Player.Views.LibraryPage.d__5.MoveNext()"

Действия по воспроизведению

  1. Клон репо
  2. открыть решение в VS 2017
  3. Запустите приложение
  4. Перейдите на страницу библиотеки из левого меню навигации (здесь нет ошибок)
  5. нажмите на любую папку, чтобы углубиться в нее
  6. Теперь вы получите это исключение.

Примечание. Я попытался выполнить ConfigureAwait(false) с помощью метода Fill() в библиотеках LibraryPage.xaml.cs и FillUpFolders() и FillUpFiles() в viewmodel, что привело к потоку Маршалла, который я не смог решить даже после использования помощника Dispather.

1 ответ

Решение

Можете ли вы удалить опцию

IndexerOption = IndexerOption.OnlyUseIndexerAndOptimizeForIndexedProperties

из функции GetVideoFoldersQuery, чтобы это выглядело так

internal static StorageFolderQueryResult GetVideoFoldersQuery(StorageFolder Folder, uint thumbnailRequestedSize)
{
    if (videoFolderOptions is null)
    {
        videoFolderOptions = new QueryOptions(CommonFolderQuery.DefaultQuery);
        videoFolderOptions.SetThumbnailPrefetch(ThumbnailMode.VideosView, thumbnailRequestedSize, ThumbnailOptions.UseCurrentScale);
    }
    return Folder.CreateFolderQueryWithOptions(videoFolderOptions);
}

С этой версией я обнаружил, что она не падает с той же ошибкой, что и ранее.

Я получаю InvalidCastException в функции GetDisplayForFile, но я думаю, что это совсем другая проблема.

редактировать

Я вставил следующий блок тестового кода в функцию OnNavigateTo в вашем коде:

var    folder = KnownFolders.VideosLibrary;

// Define two different QueryOptions
var    qo_1   = new QueryOptions(CommonFolderQuery.DefaultQuery);
var    qo_2   = new QueryOptions(CommonFolderQuery.DefaultQuery)
                    {
                      IndexerOption = IndexerOption.OnlyUseIndexerAndOptimizeForIndexedProperties
                    };

// Query folder and then query the files and subfolders
// using the first QueryOptions qo_1
var    fq_1   = folder.CreateFolderQueryWithOptions ( qo_1 ) ;
var    fo_1   = await fq_1.GetFoldersAsync ( 0, 5 ) ;
foreach ( var subfold in fo_1 )
{
  var f_1  = subfold.CreateFileQueryWithOptions ( qo_1 ) ;
  var sf_1 = subfold.CreateFolderQueryWithOptions ( qo_1 ) ;
}

// Query folder and then query the files and subfolders
// using the first QueryOptions qo_2
var    fq_2   = folder.CreateFolderQueryWithOptions ( qo_2 ) ;
var    fo_2   = await fq_2.GetFoldersAsync ( 0, 5 ) ;
foreach ( var subfold in fo_2 )
{
  var f_2  = subfold.CreateFileQueryWithOptions ( qo_2 ) ;
  var sf_2 = subfold.CreateFolderQueryWithOptions ( qo_2 ) ;
}

Он определяет два разных объекта QueryOption, а затем выполняет двухуровневый запрос с каждым из них.

Первый работает нормально.
Второй сбой при запросе на втором уровне.

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

Другие вопросы по тегам