【问题标题】:Async StackOverflowException异步 StackOverflowException
【发布时间】: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&lt;AlbumView&gt;
  • stackoverflow 中有很多有用的答案,只需谷歌一下,你就会得到你需要的。请尝试this 回答。或者只是设置一个断点,然后单步执行您的代码。
  • @fenixil 我已经尝试过我的问题中解释的断点,但它似乎没有帮助。感谢堆栈跟踪。我稍后会尝试。
  • @fenixil 这个答案对我不起作用,调用堆栈没有显示任何功能。 OnNavigatedTo 只被调用一次。

标签: c# uwp win-universal-app


【解决方案1】:

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

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

将您的代码更改为:

SearchPage.xaml

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

最好的问候。

【讨论】:

  • 对不起,我刚刚找到另一个StackOverflowException,你能测试一下吗?当我输入SearchPage 然后关闭应用程序时会发生这种情况。我的代码也更新了。
  • 对不起,我无法重现这个问题。如果还是像之前一样显示StackOverflowException,请尝试注释掉一些可能在xaml中报错的控件,然后定位问题的原因。
  • 可能是因为您没有得到任何搜索结果,或者您没有使用我的最新代码?在我的测试中,我发现只要有任何艺术家/专辑/歌曲/播放列表的搜索结果,当您在SearchPage 上时,退出时就会出现StackOverflowException。我尝试注释掉保存这些数据的 4 个 StackPanels 的每个控件,但它仍然发生。所以这似乎不是 XAML 问题?
  • @SeakyLone 请确保您学会了如何解决StackOverflowException 的问题,这样您就不需要在每次出现时都发布问题;)
  • @fenixil 我不认为这是一个与 c# 相关的问题,正如这个答案所暗示的那样。我的调用堆栈没有任何与 c# 相关的内容。我刚刚通过编写递归函数检查了我的调试设置。它正确地为我提供了带有一堆该功能的调用堆栈。但我的问题是它没有报告 c# 问题。所以我不知道我还能看什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多