2012-06-11 63 views
4

我在我的asp.net 4.0應用程序中有一個http請求。我希望線程在繼續之前等待。C#:等待一個請求在C#4.5中完成

HttpClient client = new HttpClient(); 
HttpResponseMessage responseMsg = client.GetAsync(requesturl).Result; 

// I would like to wait till complete. 

responseMsg.EnsureSuccessStatusCode(); 
Task<string> responseBody = responseMsg.Content.ReadAsStringAsync(); 
+1

您是否嘗試使用同步方法(而不是異步)? – funerr

+0

它是.NET 4.5(http://msdn.microsoft.com/de-de/library/system.net.http.httpcontent.readasstringasync(v=vs.110).aspx)。羅伯特的回答是正確的。 – Sascha

+0

我不太明白你的問題,但是如果你調用.result,它應該阻止線程,直到它完成對嗎? – Vincent

回答

8

在呼叫.Wait()的responseBody任務

+0

我試過了,它不起作用。 responseBody.Wait(); – user516883

+0

它是做什麼的? –

3

在4.5(你的標題是這麼說的),你可以使用async/await

public async void MyMethod() 
{ 
    HttpClient client = new HttpClient(); 
    HttpResponseMessage responseMsg = await client.GetAsync("http://www.google.com"); 

    //do your work 
} 

要下載一個字符串,你可以簡單地使用

public async void Question83() 
{ 
    HttpClient client = new HttpClient(); 
    var responseStr = await client.GetStringAsync("http://www.google.com"); 

    MessageBox.Show(responseStr); 

} 
2

一個選項是調用.Wait(),但更好的選擇是使用異步

public async void GetData() 
{ 
    using(HttpClient client = new HttpClient()) 
    { 
     var responseMsg = await client.GetAsync(requesturl); 
     responseMsg.EnsureSuccessStatusCode(); 
     string responseBody = await responseMsg.Content.ReadAsStringAsync(); 
    } 
} 

}

1

這可以通過使用async keywordawait keyword來完成,像這樣:

// Since this method is an async method, it will return as 
// soon as it hits an await statement. 
public async void MyMethod() 
{ 

    // ... other code ... 

    HttpClient client = new HttpClient(); 
    // Using the async keyword, anything within this method 
    // will wait until after client.GetAsync returns. 
    HttpResponseMessage responseMsg = await client.GetAsync(requesturl).Result; 
    responseMsg.EnsureSuccessStatusCode(); 
    Task<string> responseBody = responseMsg.Content.ReadAsStringAsync(); 

    // ... other code ... 

} 

請注意,關鍵字的await不會阻塞線程。相反,在異步方法的其餘部分排隊後,控制權將返回給調用者,以便繼續處理。如果您需要MyMethod()的調用者也等待client.GetAsync()完成,那麼最好使用同步調用。

+0

您也可以使用await檢索responseBody作爲字符串。你也應該用一個使用塊來處理客戶端 –

+0

非常好的一點。我想這就是我發佈不完整的代碼而沒有添加任何東西來顯示。 –