На этой странице происходит сбой.

Хотя мне не сделали исключения, я считаю, что сбой должна быть функция Setup.

Он отлично работает, когда параметр songs содержит около 300 элементов (я еще не проверял максимальное значение).

Однако он вылетает, когда есть 800 или более элементов (я также еще не тестировал этот минимум), из-за чего у меня было бы много AlbumView, конструктор которых определен здесь.

В своем конструкторе он находит и устанавливает Cover (который происходит от StorageItemThumbnail) асинхронно. И я считаю, что поиск эскиза - это операция ввода-вывода. Причиной сбоя могут быть частые операции ввода-вывода. Но я не уверен в этом.

Может кто-нибудь дать мне совет, как исправить сбой?

Источником данных для songs являются музыкальные файлы в папке на моем компьютере. Я сгруппировал их по подпапкам, и мое приложение отлично работает с отдельными подпапками. Он вылетает, когда я использую корневую папку всех своих музыкальных файлов, в которой содержится около 2800 файлов.

---Обновить---

Я только что подтвердил, что сбой был вызван частым вводом-выводом, закомментировав функцию FindThumbnail.

Поэтому я пытаюсь исправить это, используя стратегию ленивой загрузки. Сначала я даю AlbumView.Cover значение по умолчанию. А затем в событии Loaded моего GridViewItem я вызываю FindThumbnail().

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

Дополнительный исходный код находится здесь.

У меня перестал вылетать, но, похоже, с этим проблема. У каждого DropShadowControl должен быть соответствующий AlbumView, но иногда я получаю null. И я думаю, что это может быть причиной моей дальнейшей проблемы, так как большинство моих DropShadowControl все еще показывают изображение по умолчанию после того, как они были загружены. Однако после перенаправления обратно на AlbumsPage эти эскизы отображаются правильно.

И я установил привязку Cover как OneWay, что вы можете видеть из здесь.

В чем моя проблема?

1
Seaky 29 Окт 2019 в 05:23

1 ответ

Лучший ответ

После некоторых попыток я обнаружил, что моя первоначальная проблема связана с частыми операциями ввода-вывода.

Поэтому, чтобы избежать этого, мне нужно выполнять ленивую загрузку.

Проблема с моей предыдущей стратегией загрузки, упомянутая в обновленном вопросе, помещающая вещи в событие Loaded, нехороша, потому что если мой DropShadowControl не отображается, даже если он загружен, у него будет { {X2}}. И я полагаюсь на это, чтобы найти эскиз.

Итак, мне нужно событие when-my-control-стала-видимой-и-datacontext-available, то есть DataContextChanged.

Поместив код в эту функцию / событие вместо Loaded, моя проблема полностью решена.

0
Seaky 2 Ноя 2019 в 01:26