2012-12-05 64 views
7

如何在Windows Phone 8中使用等待與HttpWebRequest?有什麼辦法可以等待Windows Phone 8中的IAsyncResult?

有沒有辦法使IAsyncResult的東西與await一起工作?

private async Task<int> GetCurrentTemperature() 
{ 
    GeoCoordinate location = GetLocation(); 

    string url = "http://free.worldweatheronline.com/feed/weather.ashx?q="; 
    url += location.Latitude.ToString(); 
    url += ","; 
    url += location.Longitude.ToString(); 
    url += "&format=json&num_of_days=1&key=MYKEY"; 

    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); 
    webRequest.Method = "POST"; 
    webRequest.BeginGetResponse(new AsyncCallback(OnGotWebRequest), webRequest); 
} 

private void OnGotWebRequest(IAsyncResult asyncResult) 
{ 
    HttpWebRequest webRequest = (HttpWebRequest)asyncResult.AsyncState; 
    var httpResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult); 
    using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
    { 
    string responseText = streamReader.ReadToEnd(); 
    } 
} 

謝謝!

回答

16

使用TaskFactory.FromAsyncBeginGetRequestStream/EndGetRequestStream方法創建Task<Stream>。然後你可以完全擺脫你的OnGotWebRequest,併爲響應做同樣的事情。

注意,目前你調用一個EndGetResponse電話BeginGetRequestStream完成時,這是不合適的開始 - 你要調用EndFoo方法來匹配BeginFoo你原來叫。您是否打電話給BeginGetResponse

+0

你是對的開始/結束。謝謝! – swinefeaster

+1

你能舉一個例子來說明如何創建和使用任務? –

+1

我在[這個問題上找到了一個完美的工作示例](http://stackoverflow.com/a/14098942/831825)。 –

4

如果你安裝了Microsoft.Bcl.Async包,你會得到一些async-已有的擴展方法,包括HttpWebRequest的擴展方法。

+0

我已經無意中發現了[這篇博文](http://wp.qmatteoq.com/async-targeting-pack-for-visual-studio-2012-why-its-useful-also-for-windows- phone-8-projects /),它解釋瞭如何使用WP8中的Microsoft.Bcl.Async軟件包。 –

相關問題