使用Windows Phone ProgressBar直到HttpWebRequest已完成下载?

时间:2011-03-29 22:20:59

标签: c# windows-phone-7 download httpwebrequest progress-bar

我正在使用以下代码下载2个XML文件:

    public static string GetXMLString()
    {
        try
        {
            var request = (HttpWebRequest)WebRequest.Create(new Uri(@"http://www.example.com/data/xml/2.0/"));request.BeginGetResponse(r =>
            {
                try
                {
                    var httpRequest = (HttpWebRequest)r.AsyncState;
                    var httpResponse = (HttpWebResponse)httpRequest.EndGetResponse(r);

                    using (var reader = new StreamReader(httpResponse.GetResponseStream()))
                    {
                        var response = reader.ReadToEnd();

                        xmlKolosej = response.ToString();
                    }
                }
                catch (Exception)
                {
                    xml = null;
                }
            }, request);
        }
        catch (Exception)
        {
            xml = null;
        }

        return xml;
    }

通过2个与上面相同的方法调用代码(从不同的URI下载2个不同的XML文件)。加载Windows Phone页面时,会按顺序调用这两种方法。有时,当我的无线连接不良时,下载需要一段时间。 我想知道,我怎么能检查HttpWebRequest是否已完成下载文件并启动ProgressBar直到下载完成? 您是否可以建议采用不同的方法解决问题?

编辑 - 附加信息: 我需要有一个进度条的原因是因为需要数据才能让用户前进。如果用户试图在应用程序中前进并且他的无线连接不良且数据仍在下载,则该方法当然会返回null。因此,进度条将锁定用户,直到完成下载。

2 个答案:

答案 0 :(得分:2)

这不是您的实际代码,因为请求是异步的,并且此代码首先不会编译,因为xml未定义,其次将始终返回null,因为方法将在请求运行之前返回。

忽略这一点,我处理多个请求的进度条的方式是在我的ViewModel上有一个计数器,当某些东西开始工作时我会递增,当某些东西结束时递减。然后我绑定我的进度条,当计数器是>时显示。 0

另请务必使用http://silverlight.codeplex.com/

中的PerformaceProgressBar

答案 1 :(得分:0)

Chris是对的,代码无效,不能在WP7上运行。这是一些代码。

private void MyMethod()
{          
   //You'll want to execute this twice, one for each xml file
   WebClient wc = new WebClient();
   wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
   wc.OpenReadAsync("{Enter url of XML File}");
}
private void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
   //Handle results here
   //Also you'll want to disable ProgressBar to show that the download is complete
   //Also you'll increment the counter that Chris suggested here
}

正如Chris提到的所有请求在Windows Phone 7中都是异步的,所以最简单的方法是创建一个计数器变量,并在每次触发“OpenReadCompleted”事件时递增它。同时,您还将禁用进度条以显示下载已完成。像你所说的错误处理也会在这里处理,除了检查网络。在提出请求之前,您可能希望这样做。

有关如何从Web读取xml文件(通常是rss或atom)的完整示例,请查看此帖子: Reading RSS Items in Windows Phone 7

注意:请记住,使用WebClient从Web中提取xml文件的方式与提取rss提要或原子提取的方式相同。