UWP System.StackOverflowException

UWP System.StackOverflowException,uwp,unhandled-exception,Uwp,Unhandled Exception,我正在创建一个新闻提要来测试它,我使用combobox_selectionChanged event来激活此功能,当selectedItem=0显示世界标题,selectedItem=1显示体育标题,selectedItem=2将可见性更改为折叠。当您选择item0或更改为item1时,它可以工作,但一旦我更改为item2,它将显示system.StackOverflowException 这是我的密码` CancellationTokenSource cts = null; publi

我正在创建一个新闻提要来测试它,我使用combobox_selectionChanged event来激活此功能,当selectedItem=0显示世界标题,selectedItem=1显示体育标题,selectedItem=2将可见性更改为折叠。当您选择item0或更改为item1时,它可以工作,但一旦我更改为item2,它将显示system.StackOverflowException

这是我的密码`

CancellationTokenSource cts = null;
    public async void NewsRepeat()
    {          
        cts?.Cancel();
        try
        {
            var localCts = cts = new CancellationTokenSource();                           
            localCts.Token.ThrowIfCancellationRequested();
            if (newsTpye.SelectedIndex == 0)
            {
                NewsPanel.Visibility = Visibility.Visible;
                RootObject2 myNews = await NewsProxy.GetNews();
                newsChannel.Text = "World Headlines";
                for (k = 0; k <= 8; k++)
                {
                    if (myNews.articles[k].title != null)
                        showTitle.Text = myNews.articles[k].title;
                    else
                        showTitle.Text = "";
                    if (myNews.articles[k].urlToImage != null)
                        newsImage.Source = new BitmapImage(new Uri(myNews.articles[k].urlToImage, UriKind.Absolute));
                    else
                        newsImage.Source = new BitmapImage(new Uri("ms-appx:///Assets/image/NoPic.jpg", UriKind.RelativeOrAbsolute));
                    if (myNews.articles[k].publishedAt != null)
                        showTime.Text = myNews.articles[k].publishedAt;
                    else
                        showTime.Text = "";
                    showDescription.Text = "(" + myNews.source + "): " + myNews.articles[k].description;
                    await Task.Delay(5000);
                    localCts.Token.ThrowIfCancellationRequested();
                }

            }
            else if (newsTpye.SelectedIndex == 1)
            {
                NewsPanel.Visibility = Visibility.Visible;
                RootObject3 mySportNews = await sportsNewsProxy.GetSportNews();
                newsChannel.Text = "Sports Headlines";

                for (k = 0; k <= 8; k++)
                {
                    if (mySportNews.articles[k].title != null)
                        showTitle.Text = mySportNews.articles[k].title;
                    else
                        showTitle.Text = "";

                    if (mySportNews.articles[k].urlToImage != null)
                        newsImage.Source = new BitmapImage(new Uri(mySportNews.articles[k].urlToImage, UriKind.Absolute));
                    else
                        newsImage.Source = new BitmapImage(new Uri("ms-appx:///Assets/image/NoPic.jpg", UriKind.RelativeOrAbsolute));

                    if (mySportNews.articles[k].publishedAt != null)
                        showTime.Text = mySportNews.articles[k].publishedAt;
                    else
                        showTime.Text = "";
                    showDescription.Text = "(" + mySportNews.source + "): " + mySportNews.articles[k].description;
                    await Task.Delay(5000);
                    localCts.Token.ThrowIfCancellationRequested();
                }
            }
            else if (newsTpye.SelectedIndex == 2)
            {
                NewsPanel.Visibility = Visibility.Collapsed;
            }
            NewsRepeat();
        }
        catch (OperationCanceledException)
        {
            // Swallow this exception only - this is probably
            // the one we've thrown ourselves
        } 
    }

    private void newsType_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

        NewsRepeat();
    }`
CancellationTokenSource cts=null;
公共异步void newsreat()
{          
cts?.Cancel();
尝试
{
var localCts=cts=new CancellationTokenSource();
localCts.Token.ThrowIfCancellationRequested();
如果(newsTpye.SelectedIndex==0)
{
NewsPanel.Visibility=Visibility.Visible;
RootObject2 myNews=await NewsProxy.GetNews();
newscannel.Text=“世界新闻标题”;

对于(k=0;k每次调用一个方法时,都会增加堆栈的使用率。当
选择了dex==2
时,您的方法只会一次又一次地调用自身,导致堆栈溢出

你能教我怎么出去吗

使用
return
语句


另一方面,您应该使用
async Task
async void
主要用于事件处理程序。

如何以及何时退出
newsreat()
method?我想知道为什么在另外两种情况下没有StackOverflow。@ravi kumar实际上从来没有,我只是简单地隐藏这个面板,你能教我如何退出吗?它可以工作,非常感谢,我认为使用forever loop重复10条新闻非常糟糕(这个API只给出10条头条新闻),有时会导致许多问题,有什么想法我可以改进它吗?我不知道为什么代码会调用自己。你应该通过一个API调用获得所有10个标题。