C# CreateQueryWithOptions导致系统互操作Com异常
好的,我有一个简单的uwp应用程序,我试图从KnownFolders.VideoLibrary获取数据,为了更快,我使用索引和查询选项。奇怪的是,在第一次加载页面时,我没有收到任何错误,但是当我尝试钻取到另一个文件夹并再次导航到同一页面时,我得到了这个Com异常 错误的类型为System.Runtime.InteropServices.COMException 调用COM组件时返回错误HRESULT E_FAIL 我的ViewModel中的FillFolders方法** 我在github repo上提供我的项目,这样任何人都可以轻松地重现问题并轻松地分析它 StackTrace “在Windows.Storage.StorageFolder.CreateFolderQueryWithOptions(QueryOptions QueryOptions)\r\n在Fluent\u Video\u Player.Helpers.FileHelper.GetVideoFoldersQuery(StorageFolder文件夹,UInt32 thumbnailRequestedSize)\r\n在Fluent\u Video\u Player.ViewModels.LibraryViewModel.d\u 11.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\u Video\u Player.ViewModels.LibraryViewModel.d\u 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\u Video\u Player.Views.LibraryPage.d\u 5.MoveNext() 复制步骤C# CreateQueryWithOptions导致系统互操作Com异常,c#,uwp,com-interop,uwp-xaml,video-library,C#,Uwp,Com Interop,Uwp Xaml,Video Library,好的,我有一个简单的uwp应用程序,我试图从KnownFolders.VideoLibrary获取数据,为了更快,我使用索引和查询选项。奇怪的是,在第一次加载页面时,我没有收到任何错误,但是当我尝试钻取到另一个文件夹并再次导航到同一页面时,我得到了这个Com异常 错误的类型为System.Runtime.InteropServices.COMException 调用COM组件时返回错误HRESULT E_FAIL 我的ViewModel中的FillFolders方法** 我在github rep
你能删除这个选项吗
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);
}
在这个版本中,我发现它不会因为与以前相同的错误而崩溃
我确实在函数GetDisplayForFile中得到了一个InvalidCastException,但我认为这是一个完全不同的问题
编辑
我在代码中的函数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对象,然后对每个对象执行两级查询
第一个很好用。第二个在第二级查询时崩溃
在我看来,这就像一个bug,你应该向微软报告。在Microsoft论坛上,您可能会得到更多帮助。33人看到了这个问题,甚至连一句评论都没有,难道每个人都对这个错误一无所知吗?:/是的。我尝试了你的应用程序,但我得到了相同的行为,我一无所知。@PhilJollans是的,现在更令人沮丧:如果我使用Folder.CreateFolderQuery()而不是CreateFolderQueryWithOptions(),那么它不会崩溃,但这只是一个临时修复,主要问题仍然是,它为什么会崩溃?如果存在有效问题,则即使在第一次加载时也会崩溃。在第一次加载时,您可以查询预定义对象KnownFolders.VideosLibrary的子文件夹。这不会崩溃。在第二种情况下,使用第一次查询返回的文件夹对象查询子文件夹。这些对象的行为不同。不,我还怀疑,我在第一次运行时也尝试使用子文件夹,但它没有崩溃。这不是我的经验。查看我对答案所做的编辑。是的,你是对的,但是如果你尝试使用VideoLibrary.GetFoldersAsync()[0]并只使用第一个文件夹而不进行任何查询,那么如果你尝试将第一个文件夹放入查询,即使它不是已知文件夹,也不会崩溃,但你猜你是对的,这是api的问题。
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);
}
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 ) ;
}