在 wp7 后台从网络下载文件

发布于 2025-01-07 02:08:01 字数 2514 浏览 1 评论 0原文

我正在用 c# 为 wp7 编写一个应用程序:2 页 [主页、第二页]。
应用程序在主页中启动,然后用户可以在第二页中导航到第二页(使用NavigationService.Navigate)。

在第二页中,WebClient 下载独立存储中的文件。

我的问题是,当用户使用后退键返回主页时,下载会冻结!

有没有一种方法可以在后台执行此操作,以便用户可以自由导航并抛出页面?

这是第二页类的代码(点击事件中还有一个带有 webClient.OpenReadAsync(uri) 的按钮)。

public partial class SecondPage : PhoneApplicationPage
{
    WebClient webClient = new WebClient();
    IsolatedStorageFile Storage = IsolatedStorageFile.GetUserStoreForApplication();

    public SecondPage()
    {
        InitializeComponent();
        webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
        webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);
    }
    void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
        try
        {
            if (e.Result != null)
            {
                string fileName = "download.txt";
                IsolatedStorageFileStream f = new IsolatedStorageFileStream(fileName, System.IO.FileMode.Create, Storage);
                long fileNameLength = (long)e.Result.Length;
                byte[] byteImage = new byte[fileNameLength];
                e.Result.Read(byteImage, 0, byteImage.Length);
                f.Write(byteImage, 0, byteImage.Length);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        try
        {
            if (ProgressDownload.Value <= ProgressDownload.Maximum)
            {
                ProgressDownload.Value = (double)e.ProgressPercentage;
            }

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}

感谢

BackgroundWorker类,我遇到了这个问题:当我调用webClient.OpenReadAsync时,bw_doWork函数(代码在下面)结束,因为该调用是异步的!所以bw报告completeEvent。

    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        WebClient webClient = new WebClient();
        webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
        webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);


        webClient.OpenReadAsync(new Uri("http://foo.com/asd.txt"));

    }

I'm writing an app in c# for wp7: 2 pages [mainpage, secondpage].
The application starts in mainpage, then the user can navigate to secondpage (using NavigationService.Navigate) in secondpage.

In secondpage WebClient downloads a file in the isolatedStorage.

My problem is that the download freezes when the user returns back to mainpage using the back key!

There is a way to do that in background so the user can navigate throw the pages freely?

Here is the code of the secondpage class (there is also a button with webClient.OpenReadAsync(uri) in the click event).

public partial class SecondPage : PhoneApplicationPage
{
    WebClient webClient = new WebClient();
    IsolatedStorageFile Storage = IsolatedStorageFile.GetUserStoreForApplication();

    public SecondPage()
    {
        InitializeComponent();
        webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
        webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);
    }
    void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
        try
        {
            if (e.Result != null)
            {
                string fileName = "download.txt";
                IsolatedStorageFileStream f = new IsolatedStorageFileStream(fileName, System.IO.FileMode.Create, Storage);
                long fileNameLength = (long)e.Result.Length;
                byte[] byteImage = new byte[fileNameLength];
                e.Result.Read(byteImage, 0, byteImage.Length);
                f.Write(byteImage, 0, byteImage.Length);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        try
        {
            if (ProgressDownload.Value <= ProgressDownload.Maximum)
            {
                ProgressDownload.Value = (double)e.ProgressPercentage;
            }

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}

Thanks

with the BackgroundWorker class i have this issue: when i call the webClient.OpenReadAsync the bw_doWork function (code is under) ends, because that call is async! so the bw reports the completeEvent.

    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        WebClient webClient = new WebClient();
        webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
        webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);


        webClient.OpenReadAsync(new Uri("http://foo.com/asd.txt"));

    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

水晶透心 2025-01-14 02:08:01

查看后台传输 API -听起来这正是您实现要求所需要的。

Check out the Background Transfer APIs - sounds like this is exactly what you need to accomplish your requirements.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文