2012-08-18 45 views
1

我已經寫了這個代碼獲取返回值:WP7從異步HttpWebRequest的

private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     HttpWebRequest request = SendRequests.CreateRequest(serverTextBox.Text); 
     IAsyncResult result = request.BeginGetResponse(new AsyncCallback(ReadWebRequestCallback), request); 
    } 

    private void ReadWebRequestCallback(IAsyncResult callbackResult) 
    { 
     HttpWebRequest myRequest = (HttpWebRequest)callbackResult.AsyncState; 
     try 
     { 
      HttpWebResponse myResponse = (HttpWebResponse)myRequest.EndGetResponse(callbackResult); 

      using (StreamReader httpwebStreamReader = new StreamReader(myResponse.GetResponseStream())) 
      { 
       string results = httpwebStreamReader.ReadToEnd(); 
       loginValue = Parser.ParseLoginValue(results); 
      } 
      myResponse.Close(); 
     } 
     catch (WebException we) 
     { 
      // 
     } 
    } 

我在這一點上的問題是,點擊按鈕後,我需要的BeginGetResponse的返回值(這裏loginValue)去隨着應用程序的執行。 我知道這是違反異步調用的整個意義,但是,有一種方法可以在繼續執行主線程之前等待結果?

回答

2

不幸的是,你已經回答了你自己的問題。在Windows Phone上,無法進行同步Web呼叫。

但你並不需要。如果您的用戶在等待網絡響應時確實沒有什麼可做的,請使用進度條加強半透明疊加層(甚至更好,請嘗試使用系統中的全局進度欄)並遵守。相比之下,如果您正在等待來自互聯網的同步呼叫返回(在移動設備上可能需要很長時間),UI將被鎖定,用戶會認爲應用程序已掛起(其中,從技術上講,是真的)。

異步性是你的朋友。玩它很好。

+0

您也可以用一些可以禁用所有控件的矩形覆蓋頁面的根框架,直到Web通話完成。 是的。 Windows Phone中的所有網絡通話都是異步的。 – Oleg 2012-08-20 06:45:51

+0

最好將根框架的「IsHitTestVisible」設置爲false。這將禁用所有觸摸事件... – 2012-08-20 10:57:33

+0

您可以將IsHitTestVisible設置爲false,但沒有關於發生什麼的視覺指示,應用程序將顯示爲已凍結(同樣,這也可能是真實的)。您需要爲用戶提供某種反饋,以瞭解正在發生的事情以及爲什麼他們不能再與應用程序交互。 – 2012-08-25 13:52:07