Async StackOverflowException - PullRequest
       9

Async StackOverflowException

0 голосов
/ 09 октября 2019

Ниже у меня есть строка кода, которая вызывает SearchAlbums(text). Удаляя эту строку, я больше не получаю StackOverflowException, поэтому я считаю, что эта строка доставляет мне неприятности.

    public ObservableCollection<AlbumView> Albums = new ObservableCollection<AlbumView>();

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);
        if (e.Parameter is string text)
        {
            // User Search
            MainPage.Instance.SetHeaderText(GetSearchHeader(text, MainPage.Instance.IsMinimal));
            History.Push(text);
            SearchArtists(text);
            SearchAlbums(text);
            SearchSongs(text);
            SearchPlaylists(text);
        }
        else
        {
            // Back to Search Page
            MainPage.Instance.SetHeaderText(GetSearchHeader(History.Pop(), MainPage.Instance.IsMinimal));
        }
    }

    public void SearchAlbums(string text)
    {
        Albums.Clear();
        foreach (var group in MusicLibraryPage.AllSongs.Where((m) => IsTargetAlbum(m, text)).GroupBy((m) => m.Album))
        {
            Music music = group.ElementAt(0);
            Albums.Add(new AlbumView(music.Album, music.Artist, group.OrderBy((m) => m.Name).ThenBy((m) => m.Artist)));
        }
    }

Поэтому я установил точку останова в этой функции и фактически смог запуститьфункция без исключения. StackOverflowException произошло после выполнения OnNavigatedTo.

Я думаю, что конструктор AlbumView может иметь к этому какое-то отношение:

    public AlbumView(string name, string artist, IEnumerable<Music> songs)
    {
        Name = name;
        Artist = artist;
        Songs = new ObservableCollection<Music>(songs);
        FindThumbnail();
    }
    public async void FindThumbnail()
    {
        foreach (var music in Songs)
            if ((Cover = await Helper.GetThumbnailAsync(music, false)) != null)
                break;
        if (Cover == null) Cover = Helper.DefaultAlbumCover;
    }

Но я также использую этот конструкторв другом месте на другой странице , и эта страница отображается отлично.

Первый фрагмент кода, размещенный выше, находится на этой странице . И исключение возникает, когда есть альбом матчей.

Я не знаю, как это исправить. Я могу только догадываться, что это может быть проблемой асинхронной операции. Заранее спасибо!

1 Ответ

1 голос
/ 09 октября 2019

Я проверил твой код. Ваша проблема не в коде, а в элементе управления.

Для экземпляров, имеющих асинхронный режим, используйте Binding вместо x:Bind для привязки экземпляра. Поскольку Binding - это привязка времени выполнения, а x:Bind - привязка времени компиляции.

измените свой код следующим образом:

SearchPage.xaml

...
<controls:Carousel.ItemTemplate>
    <DataTemplate x:DataType="data:AlbumView">
        <local:GridAlbumControl DataContext="{Binding}" />
    </DataTemplate>
</controls:Carousel.ItemTemplate>
...

С уважением.

...