2011-07-31 68 views
0

我正在使用silverlight 4和新的異步CTP。webClient.DownloadStringTaskAsync()。Wait()凍結UI

 private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      WebClient wb = new WebClient(); 
      var t = wb.DownloadStringTaskAsync("http://www.google.com"); 
      t.Wait();    
     } 

此代碼導致UI凍結。
在另一方面,該代碼工作正常:

 private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      WebClient wb = new WebClient(); 
      var t = Task.Factory.StartNew(() => Debug.WriteLine("Doing something")); 
      t.Wait();    
     } 

請告訴我兩者之間的差異,以及是什麼原因導致的第一個凍結?

回答

0

.Wait()阻止任務,直到它完成。

第一個例子是實際工作,即提取www.google.com.Wait()將不允許事件處理程序返回,直到該頁面已被下載。

第二個示例僅調用Debug.WriteLine,即立即返回的調用,允許任務立即完成,因此您從未注意到.Wait()正在阻止事件處理程序。

很可能你想用.ContinueWith()而不是.Wait()來訪問異步下載的結果。這樣事件處理程序立即返回,您可以將代碼放在.ContinueWith()塊中,以便下載數據。

+2

但第一個例子永遠不會結束。它卡住了。這是爲什麼 ? –

+0

當我運行該代碼時,它幾乎立即返回。最好的辦法是一個網絡問題,阻止連接請求。代理指向錯誤的服務器,壞的DNS,不知道。 –