【发布时间】:2019-10-09 01:26:29
【问题描述】:
下面有一行代码调用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 中。并且当有匹配专辑时发生异常。
我不知道如何解决它。我只能猜测这可能是异步操作的问题。提前致谢!
【问题讨论】:
-
StackOverflowException应该包含一个解释调用树的堆栈跟踪。我怀疑Albums.Add以某种方式间接导致调用OnNavigatedTo -
@fenixil 我也希望 VS 可以向我显示堆栈跟踪,但我无法找到它。它只是显示一个新页面,上面写着
StackOverflowException。你知道我在哪里可以找到它吗?Albums只是一个ObservableCollection<AlbumView>。 -
stackoverflow 中有很多有用的答案,只需谷歌一下,你就会得到你需要的。请尝试this 回答。或者只是设置一个断点,然后单步执行您的代码。
-
@fenixil 我已经尝试过我的问题中解释的断点,但它似乎没有帮助。感谢堆栈跟踪。我稍后会尝试。
-
@fenixil 这个答案对我不起作用,调用堆栈没有显示任何功能。
OnNavigatedTo只被调用一次。
标签: c# uwp win-universal-app