2013-04-07 55 views
1

我想在Windows Phone應用程序中非異步地下載數據。我會做一個下載類,並有一個簡單的方法來從URL下載字符串。在其他平臺上,我會使用:如何非異步下載數據?

public class TextDownloader 
{ 
     public string GetString(string url) 
     { 
      WebClient web = new WebClient(); 
      string s = web.DownloadString("http://www.google.com"); 
      return s; 
     } 
} 

它會運作良好:簡單,最小的代碼。但是,WebClient.DownloadString方法在Windows Phone 7上不可用,也沒有許多WebRequest選項。有沒有其他方法可以在Windows Phone中非異步地下載數據?我寧願不必爲下載和錯誤創建多個事件,只需要一個簡單的方法返回值或拋出異常。

+0

@lelyor,這與這個問題有什麼關係? – DaveShaw 2013-04-07 23:10:17

+0

你應該使用異步的方式來避免阻塞你的用戶界面線程 - 這就是WP現在的做法。 – 2013-04-08 00:09:09

+0

@igrali我知道這是一個完全舊的問題,但在這種情況下,我會一直在非UI線程上調用同步下載方法。 – msbg 2015-03-26 01:16:13

回答

5

實際上,您不能使用WebClient下載的同步模型進行下載。這是設計的,鑑於Windows Phone應用程序的性質,您應該遵循這種方法。

解決您的問題 - 回調。你可以很容易地重構你的功能,像這樣:

public void GetString(string url, Action<string> onCompletion = null) 
{ 
    WebClient client = new WebClient(); 
    client.DownloadStringCompleted += (s, e) => 
     { 
      if (onCompletion != null) 
       onCompletion(e.Result); 
     }; 
    client.DownloadStringAsync(new Uri(url)); 
} 

這使得它相對容易使用,並在完成時觸發一個動作。還有另一種方法來做到這一點,那就是 - async/await。你需要通過的NuGet安裝Bcl.Async包:

Install-Package Microsoft.Bcl.Async -Pre 

這將讓你這樣做:

public async Task<string> DownloadString(string url) 
{ 
    WebClient client = new WebClient(); 
    return await client.DownloadStringTaskAsync(url); 
} 

不過,雖然,它會被綁定到異步模型,只是包裹在一個不同方式,並且線程在返回給調用者之前將等待獲取該字符串。

+0

只是一個說明。後面的代碼片段只能與VS 2012一起工作,即使它使用.net 4.0,因爲它使用C#5.0 – Aron 2013-04-08 02:36:39

+0

這是正確的。 – 2013-04-08 02:39:39