Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CreateQueryWithOptions导致系统互操作Com异常_C#_Uwp_Com Interop_Uwp Xaml_Video Library - Fatal编程技术网

C# CreateQueryWithOptions导致系统互操作Com异常

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

好的,我有一个简单的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()

复制步骤

  • 复制回购协议
  • 在VS 2017中打开解决方案
  • 运行应用程序
  • 从左侧导航菜单转到库页面(注意此处无错误)
  • 单击任何文件夹以钻取到其中
  • 现在您将获得此异常
  • 注意:我尝试在LibraryPage.xaml.csFillUpFolders()和FillUpFiles()上使用Fill()方法执行configurewait(false)viewmodel中的方法这会导致Marshall线程,即使在使用Dispather helper后,我也无法解决该问题


    你能删除这个选项吗

    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 ) ;
    }