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()"
Действия по воспроизведению
- Клон репо
- открыть решение в VS 2017
- Запустите приложение
- Перейдите на страницу библиотеки из левого меню навигации (здесь нет ошибок)
- нажмите на любую папку, чтобы углубиться в нее
- Теперь вы получите это исключение.
Примечание. Я попытался выполнить 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.