2012-11-14 19 views
2

我試圖在Windows 8 Metro應用程序中獲取網站的內容。我仍然對asyn和wait方法感到困惑。
但是,這是我所:在WinRT中從UI調用HttpClient - 沒有任何反應

private void HelloButton_Click(object sender, RoutedEventArgs e) 
{ 
    GetPage().Wait(); 
} 

private async Task GetPage() 
{ 
     HttpClient client = new HttpClient(); 

     HttpResponseMessage response = await client.GetAsync("http://www.supertext.ch"); 
     response.EnsureSuccessStatusCode(); 
     string responseBody = await response.Content.ReadAsStringAsync(); 
} 

Unfortuantely,什麼都不會發生。如果嘗試調試它,它會停止在GetAsync()。
我是否需要使HelloButton_Click函數也是異步?
即使我等待函數GetPage()的完成?
我可以直接從GUI線程調用網絡請求嗎?

回答

2

不要致電Wait的任務。 await吧。這是一個常見的初學者錯誤。

+0

好了,等待是完全錯誤的?什麼時候適合使用它? – Remy

+1

@Remy等待線程阻塞,導致死鎖。我建議你在Stack Overflow上搜索「等待等待死鎖」。我相信你會在這個話題上找到很好的材料。例如:http://stackoverflow.com/questions/13140523/await-vs-task-wait-deadlock – usr

+1

@雷米:這幾乎總是錯的。 'Wait'是.NET 4的保留,*不用於'async'代碼。我有[詳細描述這種僵局的博客文章](http://nitoprograms.blogspot.com/2012/07/dont-block-on-async-code.html)。 –

2

更改HelloButton_Click到:

private async void HelloButton_Click(object sender, RoutedEventArgs e) 
{ 
    await GetPage(); 
}