2014-09-30 251 views
0

我想對某些服務器進行異步調用,以便主線程不會停止請求。c#異步http請求

我創造了我的要求是這樣的:

//Create Request 
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); 
     request.Method = method; 
     request.ContentType = "application/XML"; 

     System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); 
     byte[] bytes = encoding.GetBytes(data); 

     request.ContentLength = bytes.Length; 

     try 
     { 
      using (Stream requestStream = request.GetRequestStream()) 
      { 
       // Send the data. 
       requestStream.Write(bytes, 0, bytes.Length); 
      } 

      request.BeginGetResponse((x) => 
      { 
       using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(x)) 
       { 
        if (callback != null) 
        { 
         callback(response.GetResponseStream()); 
        } 
       } 
      }, null); 
     } 
     catch (Exception ex) 
     { 
      //TODO: Log error 
     } 

但仍然是線程停止對該請求一段時間。特別是用

(Stream requestStream = request.GetRequestStream()) 

行有沒有什麼辦法,使我們可以把它完全異步或一些其他更好的辦法,使我們的主線程不會掛起該請求。

+0

當然 - 調用[GetRequestStreamAsync(http://msdn.microsoft.com/en-us/library/system.net.webrequest.getrequeststreamasync( v = vs.110).aspx)並等待結果。 – 2014-09-30 16:17:23

+1

如果可以的話,或者只是使用'HttpClient'和'await' - 它更加簡潔。 – Luaan 2014-09-30 16:19:57

+0

[documentation](http://msdn.microsoft.com/en-us/library/d4cek6cc.aspx)說,如果您調用'GetRequestStream',那麼您必須*調用'GetResponse'來獲取響應。如果你想要一個使用'BeginGetResonse'的異步響應,那麼你必須*調用'BeginGetRequeststream'來獲取請求流。 – 2014-09-30 19:05:32

回答

0

需要使用異步方法並等待它們。

using (var stream = await request.GetRequestStreamAsync()) 
{ 
    await stream.WriteAsync(bytes, 0, bytes.Length); 
} 
0

這是一個簡單的示例,我正在使用它來發出異步請求。馬克與async keyword

using (var httpClient = new HttpClient()) 
{ 
    string requestContent = string.Empty; // JSON Content comes here 
    HttpContent httpContent = new StringContent(requestContent, Encoding.UTF8, "application/json"); 
    HttpRequestMessage httpRequestMessage = new HttpRequestMessage(Verb, url); 
    httpRequestMessage.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
    httpRequestMessage.Content = request.Verb == HttpMethod.Get ? null : httpContent; 
    response = httpClient.SendAsync(httpRequestMessage); 
    var responseContent = await response.Result.Content.ReadAsStringAsync(); 

你的方法}

1
using (HttpClient client = new HttpClient()) 
{ 
    var content = new StringContent(data, Encoding.UTF8, "application/xml"); 
    var response = await client.PostAsync(uri, content); 
    var respString = await response.Content.ReadAsStringAsync(); 
} 
+0

我在這裏有點困惑。在請求中,我們通過等待等待實際等待響應。此外,如果方法A()發出請求,那麼我們必須通過等待任務A()來調用,然後等待響應。僅使其同步。 – user2692032 2014-10-01 06:13:09

+0

@ user2692032 [在異步方法中發生了什麼](http://msdn.microsoft.com/zh-cn/library/hh191443.aspx) – EZI 2014-10-01 07:16:31