好的,所以我有一个简单的 uwp 应用程序,我正在尝试从KnownFolders.VideoLibrary获取数据并使其更快,我正在使用带有QueryOptions的索引。奇怪的是,在第一次加载页面时我没有收到任何错误,但是当我尝试钻入另一个文件夹并再次导航到同一页面时,我得到了这个Com Exception
错误的类型为 System.Runtime.InteropServices.COMException
对 COM 组件的调用已返回错误 HRESULT E_FAIL
我的 ViewModel 中的 FillFolders 方法**
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
堆栈跟踪
" 在 Windows.Storage.StorageFolder.CreateFolderQueryWithOptions(QueryOptions queryOptions)\r\n 在 Fluent_Video_Player.Helpers.FileHelper.GetVideoFoldersQuery(StorageFolder 文件夹,UInt32 thumbnailRequestedSize)\r\n 在 Fluent_Video_Player.ViewModels.LibraryViewModel.d__11.MoveNext()\r \n--- 从先前引发异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter。 HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.GetResult()\r\n at Fluent_Video_Player.ViewModels.LibraryViewModel.d__9.MoveNext()\r\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.Views.LibraryPage。 d__5.MoveNext()"
重现步骤
- 克隆仓库
- 在 VS 2017 中打开解决方案
- 运行应用程序
- 从左侧导航菜单转到图书馆页面(注意这里没有错误)
- 单击任何文件夹以深入其中
- 现在你会得到这个异常。
注意:我尝试在视图模型中使用LibraryPage.xaml.cs和FillUpFolders()和FillUpFiles()方法上的Fill()方法执行ConfigureAwait(false),这导致Marshall 线程,即使在使用Dispather 帮助器后我也无法解决