如何非异步下载数据

本文关键字:数据 下载 异步 何非 | 更新日期: 2023-09-27 18:08:09

我想在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;
      }
 }

它会工作得很好:简单,最少的代码。但是,WebClient.DownloadString方法在Windows Phone 7上不可用,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。您将需要安装Bcl。通过NuGet异步包:

Install-Package Microsoft.Bcl.Async -Pre 

它会让你这样做:

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

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