繁体   English   中英

如何非异步下载数据?

[英]How to download data non asynchronously?

我想在Windows Phone应用程序中异步下载数据。 我将创建一个downloader类,并具有一个简单的方法来从URL下载字符串。 在其他平台上,我将使用:

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

它会很好地工作:简单,最少的代码。 但是,Windows Phone 7上不提供WebClient.DownloadString方法,也没有许多WebRequest选项。 是否有其他方法可以非同步地在Windows Phone中下载数据? 我宁愿不必为下载和错误创建多个事件,而只需使用一个简单的方法即可返回值或引发异常。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM