C# 如何非异步下载数据?

C# 如何非异步下载数据?,c#,windows-phone-7,asynchronous,download,webclient,C#,Windows Phone 7,Asynchronous,Download,Webclient,我想在Windows Phone应用程序中非异步下载数据。我将创建一个downloader类,其中包含一个从URL下载字符串的简单方法。在其他平台上,我会使用: public class TextDownloader { public string GetString(string url) { WebClient web = new WebClient(); string s = web.DownloadString("h

我想在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));
}
它可以让您这样做:

public async Task<string> DownloadString(string url)
{
    WebClient client = new WebClient();
    return await client.DownloadStringTaskAsync(url);
}
公共异步任务下载字符串(字符串url)
{
WebClient客户端=新的WebClient();
返回wait client.downloadstringtasksync(url);
}

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

实际上,您不能使用同步模型下载
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));
}
它可以让您这样做:

public async Task<string> DownloadString(string url)
{
    WebClient client = new WebClient();
    return await client.DownloadStringTaskAsync(url);
}
公共异步任务下载字符串(字符串url)
{
WebClient客户端=新的WebClient();
返回wait client.downloadstringtasksync(url);
}

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

@lelyor,这与这个问题有什么关系?你应该使用异步方式来避免阻塞你的UI线程-这就是现在在WP上做的事情。@igrali我知道这是一个完全陈旧的问题,但在这种情况下,我会在非UI线程上调用同步下载方法。@lelyor,这和这个问题有什么关系?你应该使用异步方式来避免阻塞你的UI线程-这就是现在在WP上做的事情。@igrali我知道这是一个完全旧的问题,但在这种情况下,我会在非UI线程上调用同步下载方法。请注意。后一个代码段仅适用于VS 2012,即使它适用于.net 4.0,因为它使用C#5.0,只是一个注释。后一个代码段只能用于VS 2012,即使它可以用于.net 4.0,因为它使用C#5.0