2013-07-14 71 views
0

我面對WP 2012中VS Express中的HttpWebRequest異步,我的目標是WP 7.1。在Visual Studio Express for WP 2012中返回異步HttpWebRequest

我希望編寫這樣的返回URL的結果的方法:

public static string GetContentByPass(string link) 
    { 
     string result = ""; 
     var request = (HttpWebRequest)WebRequest.Create(
      new Uri(link)); 
     request.BeginGetResponse(r => 
     { 
      var httpRequest = (HttpWebRequest)r.AsyncState; 
      var httpResponse = (HttpWebResponse) httpRequest.EndGetResponse(r); 

      using (var reader = new StreamReader(httpResponse.GetResponseStream())) 
      { 
       var response = reader.ReadToEnd(); 
       Deployment.Current.Dispatcher.BeginInvoke(new Action(() => 
       { 
        result = response; 
       })); 
      } 
     }, request); 
     return result; 
    } 

使用此類似:

result = Util.GetContentByPass("http://google.com"); 

但結果始終是空的。

任何想法?

謝謝:-)

編輯

這裏是我的解決方案,希望這會幫助別人需要:-)

public static string GetContentFromURL(string url) 
    { 
     var task = GetResult(url); 
     return task.Result; 
    } 

    private static Task<string> GetResult(string url) 
    { 
     url = url.Replace("http://",""); 
     url = "http://" + url; 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     request.Method = "GET"; 
     request.UserAgent = "Mozilla/5.0 (Linux; U; Android 4.0.3; de-ch; HTC Sensation Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"; 
     Task<WebResponse> task = Task.Factory.FromAsync(
       request.BeginGetResponse, asyncResult => request.EndGetResponse(asyncResult), (object)null 
      ); 

     return task.ContinueWith(t => ReadStreamFromResponse(t.Result)); 
    } 

    private static string ReadStreamFromResponse(WebResponse response) 
    { 
     using (Stream responseStream = response.GetResponseStream()) 
     using (StreamReader sr = new StreamReader(responseStream)) 
     { 
      //Need to return this response 
      string strContent = sr.ReadToEnd(); 
      return strContent; 
     } 
    } 
+0

歡迎來到**異步**的美妙世界!你不能那樣做。 – SLaks

+0

我知道我不能這樣做,但任何解決方案? –

回答

0

你試圖打敗的目的在異步響應到達之前通過返回result來異步。

你也需要讓你的函數也是異步的。

考慮使用Taskawait

+0

我看了很多關於這方面的話題,但我不知道爲什麼我不能使用任務,Systems.Threading沒有包含它。關於「等待」你能解釋更多嗎?謝謝。 –

+0

http://stackoverflow.com/a/16138078/34397 – SLaks

+0

感謝您的回答和鏈接。 –

相關問題