如何非异步下载数据?

时间:2013-04-07 22:03:58

标签: c# windows-phone-7 asynchronous download webclient

我想在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中异步下载数据?我宁愿不必为下载和错误创建多个事件,只需要一个简单的方法返回一个值或抛出异常。

1 个答案:

答案 0 :(得分: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);
}

但是,它仍将绑定到异步模型,只是以不同的方式包装,线程将等待获取字符串,然后再将其返回给调用者。