2010-11-05 113 views
0

在我的WP7應用程序我打電話和使用這些方法web服務:問題的異步Web服務響應

在我的網頁cs文件:

public void Page_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (NavigationContext.QueryString["val"] == "One") 
     { 
      listAgences=JSON.callWSAgence("http://...");   

      InitializeComponent(); 
      DataContext = this;     
     } 
    } 

在我的JSON類,我有這些方法:

public List<Agence> callWSAgence(string url) 
    { 

      WebClient webClient = new WebClient(); 
      Uri uri = new Uri(url); 
      webClient.OpenReadAsync(uri); 

      webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(OpenReadCompletedTestAgence);     

      return listAgences; 
    } 

    public void OpenReadCompletedTestAgence(object sender, OpenReadCompletedEventArgs e) 
    {    
      StreamReader reader = new System.IO.StreamReader(e.Result); 
      jsonResultString = reader.ReadToEnd().ToString(); 
      addAgencesToList();    
      reader.Close(); 
    } 

    public void addAgencesToList() 
    {       
      jsonResultString = json.Substring(5, json.Length - 6); 
      listAgences = JsonConvert.DeserializeObject<List<Agence>>(json);      
    } 

的問題是,在JSON類的OpenReadCompletedTest方法不正確稱爲後

webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(OpenReadCompletedTestAgence); 

所以返回的listAgences是空的。

但後來OpenReadCompletedTest被調用,一切工作都被罰款,但我的視圖已被加載。

我能做些什麼來進行一種同步調用,或者在webservice響應被解析和我的列表被填充後重新加載我的視圖。

+0

我建議使用無擴展退房以下問題以瞭解更多信息:http://msdn.microsoft.com/en-us/devlabs/ee794896這將使異步編程更容易... – 2011-01-02 11:30:20

回答

0

您看到的行爲(問題)是因爲網絡請求爲asynchronously

如果你想有一個單獨的對象調用Web服務器,這將需要處理回調來處理響應或進行適當的更改。

另外:
- 問題中的代碼沒有顯示變量json被定義爲什麼。在Page_Loaded它看起來像一個自定義類,但在OpenReadCompletedTestAgenceaddAgencesToList它看起來像一個字符串。
- Page_Loaded中的代碼將值設置爲listAgences兩次。

有關使臺異步調用synchrously Faking synchronous calls in Silverlight WP7

+0

你是對的馬特關於「json」和listAgences在我的文章中,我沒有給予足夠的重視。在page_loaded中,它確實是一個自定義類和方法addToList中的一個字符串。我會編輯我的帖子。 – wallou 2010-11-05 12:01:43

+0

我會看看你給我的鏈接 – wallou 2010-11-05 12:02:29