Async StackOverflowException

问题描述 投票:-2回答:1

下面有一行代码调用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;
    }

但是我还在另一个page的其他地方也使用了此构造函数,并且page完美显示了。

上面发布的第一段代码在此page中。当有匹配的相册时,会发生例外。

我不知道如何解决。我只能猜测这可能是异步操作的问题。预先感谢!

c# uwp win-universal-app
1个回答
0
投票

我测试了您的代码。您的问题不在于代码隐藏,而在于控件。

对于具有异步的实例,请使用Binding而不是x:Bind来绑定实例。因为Binding是运行时绑定,而x:Bind是编译时绑定。

将您的代码更改为此:

SearchPage.xaml

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

最诚挚的问候。

© www.soinside.com 2019 - 2024. All rights reserved.