2014-03-06 80 views
1

我开发一个应用程序的Windows Phone和我有没有人帮我...我 有一个按钮,单击时,显示一个页面的主体内容。异步任务的Windows Phone

搜索了很多关于如何下载的东西,而不是冻结德UI之后,我发现这个代码,为我工作得很好:

private async void btnBotao_Click(object sender, RoutedEventArgs e) 
     { 
      string returnedTaskTResult = await AccessTheWebAsync(); 

      HtmlDocument doc = new HtmlDocument(); 
      doc.LoadHtml(returnedTaskTResult); 
      var body = doc.DocumentNode.SelectSingleNode("//body").WriteContentTo(); 
      txb.Text = body; 
     } 

     public async Task<string> AccessTheWebAsync() 
     { 
      HttpClient client = new HttpClient(); 
      Task<string> getStringTask = client.GetStringAsync("PAGE"); 

      string urlContents = await getStringTask; 

      return urlContents; 
     } 

我只是想知道这是否是正确的做这样...因为我几乎一无所知线程,即使这个工作对我来说,这也许不是更好的方式来做到这一点......也许这是不完整的......

非常感谢!也

 Task<string> getStringTask = client.GetStringAsync("PAGE"); 

     string urlContents = await getStringTask; 

     return urlContents; 

这样的:

回答

1

看起来不错 - 我想改变的仅仅是简化的语法:

public async Task<string> AccessTheWebAsync() 
{ 
    HttpClient client = new HttpClient(); 
    return await client.GetStringAsync("PAGE"); 
} 

你甚至可以完全消除“AccessTheWeb”功能,因为它适合在一个单一的行:

private async void btnBotao_Click(object sender, RoutedEventArgs e) 
{ 
    string returnedTaskTResult = await new HttpClient().GetStringAsync("PAGE"); 

    HtmlDocument doc = new HtmlDocument(); 
    doc.LoadHtml(returnedTaskTResult); 
    var body = doc.DocumentNode.SelectSingleNode("//body").WriteContentTo(); 
    txb.Text = body; 
} 
+0

因此,是“等待”,“创建”另一个线程,并使用它下载页面,使UI线程“免费”? 下载完成后,执行下列行吗? 这是正确的吗? –

+0

@ user2751628是的,正好 – McGarnagle

+0

哇!这比我想象的更容易...非常感谢! –

1

如果我不是完全地错了,你可以写更多

return await client.GetStringAsync("PAGE"); 

(只是有点向前伸直,更少的代码,什么对我来说是一个好东西)当涉及到逻辑部分时,如果使用await/async,框架将处理大部分内容。所以,我什么也没看到谁造成的问题