2017-07-19 49 views
1

爲了測試它,我使用combobox_selectionChanged事件來激活此功能,當selectedItem = 0顯示世界標題時,selectedItem = 1顯示體育標題,selectedItem = 2將可見性更改爲摺疊。當您選擇item0或更改ITEM1它可以工作,但一旦我改變ITEM2,它讓我system.StackOverflowExceptionUWP 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(); 
    }` 

enter image description here

+0

如何以及何時退出您的'NewsRepeat()'方法?我想知道爲什麼在其他兩種情況下沒有StackOverflow。 –

+0

@ ravi kumar其實從來沒有,我只是簡單地隱藏這個面板,你可以教如何退出? – WANGJAY

回答

2

每次你調用一個方法,你會增加堆棧的使用。當SelectedIndex == 2,你的方法會一遍又一遍地調用自己,導致堆棧溢出。

你能教導如何退出嗎?

使用return聲明。

請注意,您應該使用async Taskasync void主要針對事件處理程序。

+0

它可以工作,非常感謝你,我認爲使用永久循環重複10條新聞非常糟糕(這個API只給出10個最重要的頭條新聞),有時會導致很多問題,我可以改進它的任何想法? – WANGJAY

+0

我不確定代碼爲什麼自己調用它。您應該通過一個API調用獲得全部10個標題。 –

相關問題