【问题标题】:CreateQueryWithOptions causes system interop Com exceptionCreateQueryWithOptions 导致系统互操作 Com 异常
【发布时间】:2018-03-28 12:41:04
【问题描述】:

好的,所以我有一个简单的 uwp 应用程序,我正在尝试从 KnownFolders.VideoLibrary 获取数据并使其更快,我正在使用 indexingQueryOptions 。奇怪的是,在第一次加载页面时我没有收到任何错误,但是当我尝试深入到另一个文件夹并再次导航到同一页面时,我得到了这个 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(任务任务)\r\n 在 System.Runtime.CompilerServices .TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.GetResult()\r\n 在 Fluent_Video_Player.ViewModels.LibraryViewModel.d__9.MoveNext()\r\n--- 堆栈结束从先前引发异常的位置跟踪 ---\r\n System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\ n 在 System.Runtime.CompilerServ ices.TaskAwaiter.GetResult()\r\n 在 Fluent_Video_Player.Views.LibraryPage.d__5.MoveNext()"

复制步骤

  1. 克隆回购
  2. 在 VS 2017 中打开解决方案
  3. 运行应用程序
  4. 从左侧导航菜单转到图书馆页面(注意这里没有错误)
  5. 单击任何文件夹以深入了解它
  6. 现在您将收到此异常。

注意:我尝试在 LibraryPage.xaml.csFillUpFolders 上使用 Fill() 方法执行 ConfigureAwait(false) ()FillUpFiles() 方法在视图模型中这会导致 Marshall 线程,即使使用 Dispather helper 我也无法解决强>

【问题讨论】:

  • 33 人看到了这个问题,连一条评论都没有,大家都对这个错误一无所知吗? ://
  • 是的。我试过你的应用程序,我得到了同样的行为,我一无所知。
  • @PhilJollans 是的,现在更令人沮丧:P

标签: c# uwp com-interop uwp-xaml video-library


【解决方案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);
}

使用这个版本,我发现它不会因为与以前相同的错误而崩溃。

我确实在 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 对象,然后对每个对象执行一个两级查询。

第一个效果很好。
第二个在第二级查询时崩溃。

在我看来,这就像一个错误,您应该向 Microsoft 报告。您可能会在 Microsoft 论坛中获得更多帮助。

【讨论】:

  • 如果我使用 Folder.CreateFolderQuery() 而不是 CreateFolderQueryWithOptions() 那么它不会崩溃,但这只是一个临时修复,主要问题仍然存在,为什么它会崩溃?如果存在有效问题,那么即使在第一次加载时它也应该崩溃。
  • 第一次加载时,查询预定义对象 KnownFolders.VideosLibrary 的子文件夹。这不会崩溃。在第二种情况下,您使用第一个查询返回的文件夹对象查询子文件夹。这些对象的行为不同。
  • nop 我也怀疑过,我也尝试在第一次运行时使用子文件夹,但它没有崩溃
  • 这不是我的经验。请参阅我对答案所做的修改。
  • 是的,你是对的,但是如果你尝试去做 VideoLibrary.GetFoldersAsync()[0] 并且只获取第一个文件夹而不查询任何内容,那么如果你尝试将第一个文件夹放入查询中即使它不是 KnownFolder 也不会崩溃,但你猜你是对的,这是 api 的问题。
猜你喜欢
  • 2015-08-03
  • 1970-01-01
  • 2013-03-04
  • 2011-08-13
  • 2015-05-03
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多