2012-08-18 50 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