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

4

1 回答 1

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);
}

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

于 2013-04-08T02:30:43.573 回答