异步 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>
...
此致。
下面我有一行代码调用了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>
...
此致。