[英]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.