2014-01-07 46 views
0

我使用下面的代碼來製作HttpWebrequest並從服務器讀取響應。Windows Phone 8中的異步HttpRequest

private async Task<bool> ReadUrlAsync()  
{  
    var request = HttpWebRequest.Create(request_url) as HttpWebRequest;     
    request.Accept = "application/json;odata=verbose"; 
    var factory = new TaskFactory(); 
    var task = factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null); 

    var response = await task; 
    Stream responseStream = response.GetResponseStream(); 
    string data; 
    using (var reader = new System.IO.StreamReader(responseStream)) 
    { 
     data = reader.ReadToEnd(); 
    } 
    responseStream.Close(); 
    return true; 
} 

,但我不知道的是,這是正確的做法,因爲我可以看到

var response = await task 

和內部方法一個TaskFactory實例。 所以是沒有辦法寫代碼,而Taskfactory或單獨await在函數內部

回答

1

也許這將幫助你

private void ReadUrlAsync() 
    { 
    var request = HttpWebRequest.Create(request_url) as HttpWebRequest;     
     request.Accept = "application/json;odata=verbose"; 
     request.BeginGetResponse(ResponseCallback, request); 
    } 

private void ResponseCallback(IAsyncResult asyncResult) 
    { 
    HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState; 
    HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult); 
    using (Stream responseStream= response.GetResponseStream()) 
     { 
     string data; 
     using (var reader = new System.IO.StreamReader(responseStream)) 
      { 
      data = reader.ReadToEnd(); 
      } 
     } 
    } 
+0

是否有任何request.ReadAsync()類型的擴展可用。 在從文件讀取的情況下,我們正在使用.ReadToEndAsync();所以有類似的方式存在? –

+0

你想讀取文件從一個特定的網址? – Jaihind

+0

在URL上發出GET請求並從URL讀取響應 –

2

等待FromAsync任務是罰款。我通常會創建一個擴展方法,以便FromAsync採用其自己的方法,但它與您在此處執行的操作幾乎完全相同(standard pattern將使用Task.Factory.FromAsync而不是new TaskFactory().FromAsync)。

需要注意的是更現代的方法是使用HttpClient from NuGet,這顯著簡化了代碼:

async Task<bool> ReadUrlAsync() 
{ 
    using (var client = new HttpClient()) 
    { 
    client.DefaultRequestHeaders.Add("Accept", "application/json;odata=verbose"); 
    using (var response = await client.GetAsync(request_url)) 
    { 
     var data = await response.Content.ReadAsStringAsync(); 
     return true; 
    } 
    } 
} 

我假設你想要的迴應明確,例如,檢查響應頭。如果你不需要它,你可以進一步簡化:

async Task<bool> ReadUrlAsync() 
{ 
    using (var client = new HttpClient()) 
    { 
    client.DefaultRequestHeaders.Add("Accept", "application/json;odata=verbose"); 
    var data = await client.GetStringAsync(request_url); 
    return true; 
    } 
}