异步 StackOverflowException

Async StackOverflowException

下面我有一行代码调用了SearchAlbums(text)。通过删除这一行,我不再得到 WhosebugException 所以我相信这是给我带来麻烦的那一行。

    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)));
        }
    }

因此,我在这个函数中设置了一个断点,我居然能够运行这个函数无一例外。 WhosebugException 发生在 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, and that page 中显示完美。

上面贴出的第一段代码在这个page。且有匹配相册时异常

我不知道如何修复它。我只能猜测这可能是异步操作的问题。提前致谢!

我测试了你的代码。你的问题不在代码隐藏,而是在控件上。

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

将您的代码更改为:

SearchPage.xaml

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

此致。