【问题标题】:Use Windows Phone ProgressBar untill HttpWebRequest has finished downloading?在 HttpWebRequest 完成下载之前使用 Windows Phone ProgressBar?
【发布时间】:2011-03-29 22:20:58
【问题描述】:

我正在使用以下代码下载 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。因此,进度条会在下载完成之前将用户锁定在应用之外。

【问题讨论】:

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


    【解决方案1】:

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

    忽略这一点,我处理多个请求的进度条的方式是在我的 ViewModel 上设置一个计数器,当某事开始某些工作时我会增加该计数器,而当某事完成时我会减少该计数器。然后我绑定我的进度条以在计数器大于 0 时显示。

    也一定要使用来自http://silverlight.codeplex.com/的PerformaceProgressBar

    【讨论】:

    • 上述代码中的 xml 是一个全局变量,因此我的示例中的代码有效,并且如果指定的 uri 确实存在,则不会返回 null。 private static string xml = null; //implemented property for xml; public static string GetXMLString() { //implmentation - look above; } 不过谢谢你的反击。有没有我可以看到类似实现的在线示例?
    【解决方案2】:

    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 提要或 atom 提要相同。

    【讨论】:

    • 是的,我在调用此方法之前会检查网络。 NetworkInterface.GetIsNetworkAvailable() 但是,例如,如果您连接到没有互联网连接的无线网络,上述方法仍然返回 true,因此我的方法中有一个额外的 try catch。我实际上正在解析自定义 XML 文件,因此无法使用 RSS 解析器。一个问题,如果我在完成的事件中增加计数器,我什么时候需要减少它?
    • 真的没关系,只要它发生在那个事件中,你应该是好的。此外,就解析 xml 文件而言,它可能会有所不同,但在下载时,方法不会改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2012-12-31
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多