2017-03-29 60 views
0

我需要將此代碼從同步轉換爲異步代碼,但到目前爲止所做的每一次嘗試都是令人沮喪的。會有人有解決辦法嗎?將HttpWebRequest從同步轉換爲異步代碼

var http = (HttpWebRequest)WebRequest.Create(Connection.GetUri(path).Uri); 
http.Accept = "application/json"; 
http.ContentType = "application/json"; 
http.Method = "POST"; 

var parsedContent = JsonConvert.SerializeObject(value); 
var encoding = new ASCIIEncoding(); 
var bytes = encoding.GetBytes(parsedContent); 

var newStream = http.GetRequestStream(); 
newStream.Write(bytes, 0, bytes.Length); 
newStream.Close(); 

var response = http.GetResponse(); 

var stream = response.GetResponseStream(); 

var sr = new StreamReader(stream); 

return JsonConvert.DeserializeObject<TReturnType>(sr.ReadToEnd()); 

的情況下,問題是,我不能使用System.Net.Http組裝但需要異步支持 。 由於無法使用上述程序集,上述代碼已從以下版本移植過來。 Connection.Client是類型HttpClient。

var response = await Connection.Client.PostAsync(
    Connection.GetUri("/transaction/announce").Uri, 
    new StringContent(JsonConvert.SerializeObject(Rpa).ToString(), 
     Encoding.UTF8, 
     "application/json")); 

return JsonConvert.DeserializeObject<NemAnnounceResponse.Response>(
    await response.Content.ReadAsStringAsync()); 
+0

爲什麼你不能使用'HttpClient'? –

回答

0

HttpWebRequest沒有提供現代化的基於任務的異步的方式來獲得響應。但它允許您使用舊的APM模式進行異步調用。見BeginGetResponse方法。

幸運的是,您可以使用幫助器方法(如Task.Factory.FromAsync)輕鬆地將老式APM轉換爲基於任務的方式。最終,你應該得到水木清華這樣的:

public static Task<WebResponse> GetResponseAsync() 
{ 
    var http = (HttpWebRequest)WebRequest.Create(Connection.GetUri(path).Uri); 
    http.Accept = "application/json"; 
    http.ContentType = "application/json"; 
    http.Method = "POST"; 

    var parsedContent = JsonConvert.SerializeObject(value); 
    var encoding = new ASCIIEncoding(); 
    var bytes = encoding.GetBytes(parsedContent); 

    var newStream = http.GetRequestStream(); 
    newStream.Write(bytes, 0, bytes.Length); 
    newStream.Close(); 

    Task<WebResponse> task = Task.Factory.FromAsync(
     http.BeginGetResponse, 
     asyncResult => http.EndGetResponse(asyncResult), 
     (object)null); 

    return task; 
} 

即使使用調用它的await像var response = await GetResponseAsync();,然後用反應繼續進行。

+0

謝謝你的工作。 – netnoob