2012-06-09 87 views
1

我正在開發一個應用程序,並且遇到了異步調用的問題...以下是我正在嘗試執行的操作。Windows Phone 7 - 等待Webclient完成

該應用程序使用JSON API,並在運行時使用必要的值(即單個新聞文章)填充全景項目中的列表框。當用戶選擇ListBox項目時,SelectionChanged事件被觸發 - 它從選定的項目中拾取articleID,並將其傳遞給Update方法以下載文章的JSON響應,使用JSON.NET對其進行反序列化,用戶轉到WebBrowser控件,該控件根據收到的響應呈現html頁面。

問題在於,我必須等待響應,然後再啓動NavigationService,但我不確定如何正確執行此操作。這樣,代碼運行「太快」,我沒有及時得到我的迴應來呈現頁面。

事件碼:

private void lstNews_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (lstNews.SelectedIndex == -1) 
     { 
      return; 
     } 

     ShowArticle _article = new ShowArticle(); 
     ListBox lb = (ListBox)sender; 
     GetArticles item = (GetArticles)lb.SelectedItem; 
     string passId = ApiRepository.ApiEndpoints.GetArticleResponseByID(item.Id); 
     App.Current.JsonModel.JsonUri = passId; 
     App.Current.JsonModel.Update(); 

     lstNews.SelectedIndex = -1; 

     NavigationService.Navigate(new Uri("/View.xaml?id=" + item.Id, UriKind.Relative)); 
    } 

的OnNavigatedTo方法在View:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
    {   
     base.OnNavigatedTo(e); 

     long sentString = long.Parse(NavigationContext.QueryString["id"]); 

     string articleUri = ApiRepository.ApiEndpoints.GetArticleResponseByID(Convert.ToInt32(sentString)); 

     //this throws an error, runs "too fast" 
     _article = App.Current.JsonModel.ArticleItems[0]; 
    } 

的更新方法:

public void Update() 
    { 
     ShowArticle article = new ShowArticle(); 

     try 
     { 
      webClient.DownloadStringCompleted += (p, q) => 
      { 
       if (q.Error == null) 
       { 
        var deserialized = JsonConvert.DeserializeObject<ShowArticle>(q.Result); 
        _articleItems.Clear(); 
        _articleItems.Add(deserialized); 
       } 
      }; 
     } 

     catch (Exception ex) 
     { 
      //ignore this 
     } 

     webClient.DownloadStringAsync(new Uri(jsonUri)); 
    } 

回答

3
異步

回調模式:

public void Update(Action callback, Action<Exception> error) 
{ 
    webClient.DownloadStringCompleted += (p, q) => 
    { 
     if (q.Error == null) 
     { 
      // do something 
      callback();    
     } 
     else 
     { 
      error(q.Error); 
     } 
    }; 
    webClient.DownloadStringAsync(new Uri(jsonUri)); 
} 

電話:

App.Current.JsonModel.Update(() => 
{ 
    // executes after async completion 
    NavigationService.Navigate(new Uri("/View.xaml?id=" + item.Id, UriKind.Relative)); 
}, 
(error) => 
{ 
    // error handling 
}); 
// executes just after async call above 
+0

謝謝!正是我需要它做的。 – zpodbojec

+0

在這種情況下,如果它回答你的問題,請接受答案。 –