【问题标题】:How to download data non asynchronously?如何非异步下载数据?
【发布时间】:2013-04-07 22:03:58
【问题描述】:

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

【问题讨论】:

  • @lelyor,这与这个问题有什么关系?
  • 你应该使用异步方式来避免阻塞你的 UI 线程——这就是现在 WP 上的事情。
  • @igrali 我知道这是一个完全老问题,但在这种情况下,我会在非 UI 线程上调用同步下载方法。

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


【解决方案1】:

确实,您不能将同步模型用于开箱即用的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);
}

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

【讨论】:

  • 只是一个注释。后面的代码 sn-p 只能与 VS 2012 一起使用,即使它可以与 .net 4.0 一起使用,因为它使用 C#5.0
猜你喜欢
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
相关资源
最近更新 更多