给定大量数据时,UWP 应用程序无一例外地崩溃

UWP App Crashes without an exception when given large amount of data

崩溃发生在这个page

虽然我没有得到异常,但我认为导致崩溃的应该是 Setup 函数。

当参数 songs 有大约 300 个项目时它工作正常(我还没有测试最大值)。

然而,当有 800 个或更多项目时它会崩溃(我还没有测试最小值),这会让我有很多 AlbumViews,其构造函数被定义为 here.

在其构造函数中,它异步查找并设置 Cover(来自 StorageItemThumbnail)。而且我相信找到缩略图是一个 IO 操作。可能是频繁的 IO 操作导致了 crash。但我不确定。

有人可以给我一些关于如何修复崩溃的建议吗?

songs的数据来源来自我电脑上某个文件夹中的音乐文件。我已将它们分组到子文件夹中,我的应用程序适用于各个子文件夹。当我使用我所有音乐文件的根文件夹时崩溃,其中有大约 2800 个文件。

---更新---

刚刚通过注释函数FindThumbnail确认崩溃是IO频繁导致的。

所以我尝试使用延迟加载策略来修复它。我先给AlbumView.Cover一个默认值。然后在 GridViewItemLoaded 事件中,我调用 FindThumbnail().

    private void DropShadowControl_Loaded(object sender, RoutedEventArgs e)
    {
        ((sender as FrameworkElement).DataContext as AlbumView)?.FindThumbnail();
    }

更多源代码是here.

我现在不再崩溃了,但这似乎有问题。每个 DropShadowControl 都应该有一个对应的 AlbumView 但有时我会得到 null 。而且我认为这可能是我进一步问题的原因,这是我的大多数 DropShadowControls 在加载后仍然显示默认图像。但是,在我重定向回 AlbumsPage 后,这些缩略图显示正确。

并且我已经将Cover的绑定设置为OneWay,你可以从here.

中看到

我的问题是什么?

经过一些尝试,我发现我最初的问题是由于频繁的IO操作。

所以为了避免这种情况,我需要进行延迟加载。

我之前在更新的问题中提到的加载策略的问题,把东西放在 Loaded 事件中,是不好的,因为如果我的 DropShadowControl 不可见,即使它被加载,它将有一个 null DataContext。我依靠它来找到缩略图。

所以我需要一个 when-my-control-become-visible-and-datacontext-available 事件,即 DataContextChanged

通过将代码放入 function/event 而不是 Loaded,我的问题就完美解决了。