如何非异步下载数据
本文关键字:数据 下载 异步 何非 | 更新日期: 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);
}
尽管如此,它仍将被绑定到异步模型,只是以不同的方式包装,线程将等待获得字符串,然后将其返回给调用者。