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



崩溃发生在此页面中。

虽然没有给我一个例外,但我相信应该是Setup函数导致了崩溃。

当参数songs有大约300个项目时,它工作得很好(我还没有测试最大值(。

然而,当有800个或更多的项目时(我也还没有测试最小值(,它会崩溃,这将使我有很多AlbumView,其构造函数在这里定义。

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

有人能给我一些关于如何修理车祸的建议吗?

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

---更新---

我只是通过注释函数FindThumbnail来确认崩溃是由频繁的IO引起的。

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

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

更多源代码在这里。

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

我已经将Cover的绑定设置为OneWay,您可以从这里看到。

我有什么问题?

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

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

在更新的问题中提到的我以前的加载策略(将东西放入Loaded事件(的问题并不好,因为如果我的DropShadowControl不可见,即使它已加载,它也会有一个null DataContext。我靠这个找到缩略图。

因此,我需要一个当我的控件可见且数据上下文可用时的事件,即DataContextChanged

通过将代码放在该函数/事件中而不是Loaded中,我的问题得到了完美的解决。

最新更新