使用Backgroundworker和byte []在后台下载文件

时间:2016-01-04 20:11:06

标签: c# wpf download webclient

我想使用Backgroundworker从网络服务器下载一些文件。我已经有了这个

WebClient req = new WebClient();

byte[] pbo = request.DownloadData(PathOnWebserver);
FileStream dwn = File.Create(LocalPath);
dwn.Write(pbo, 0, pbo.Length);
dwn.Close();`

在我的第一次尝试中,成功运行WindowsFormapplication。 现在我在Wpf-Application中运行相同的代码,它抛出一个OutOfMemoryException。 所以我搜索了这个问题,但我没有找到一个存储数据的解决方案,直到下载完整的文件。 我需要这个,因为我必须稍后处理这些文件,如果我有损坏的数据,就像我关闭应用程序,我可以将它们扔进垃圾桶。

是否有一种简单的方法可以运行类似的代码来保证数据的完整性?

2 个答案:

答案 0 :(得分:0)

Task Parallel Library (TPL)提供的Task课程可能会更幸运。下面是一个可能的解决方案的简短模拟。您显然需要实例化下载数据时使用的变量,例如LocalPathPathOnWebserver

// Call this method to start the download
private void DownloadData()
{
    // Create a TaskFactory on the current Thread; the UI thread
    TaskFactory UITaskFactory = 
        new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext());

    // Create and start a Task that will download the data
    var DoDownloadTake = Task.Factory.StartNew(() =>
    {
        Boolean success = false;
        try
        {
            WebClient wc = new WebClient();
            byte[] pbo = wc.DownloadData(PathOnWebserver);
            FileStream dwn = File.Create(LocalPath);
            dwn.Write(pbo, 0, pbo.Length);
            dwn.Close();
            success = true;
        }
        catch(Exception ex){} // Handles this however you'd like to.

        // Call a method on the UI thread to notify us the download completed
        UITaskFactory.StartNew(() => DataFinishedDownloading(success));
    });
}

// Once the data is finished downloading this method will be called
private void DataFinishedDownloading(Boolean success)
{
    if(success)
        ;// Do something with data at LocalPath
    else
        ;// Download failed
}

答案 1 :(得分:0)

只是做

req.DownloadFile(PathOnWebserver, TempLocalPath); 
File.Move(TempLocalPath, LocalPath);

如果TempLocalPath与LocalPath位于同一驱动器上,则Move是原子的,因为它只是执行重命名。如果您遇到故障,只需在启动时删除临时文件即可。 Chrome和Firefox等程序通过向文件名添加.partial来执行此方法,而文件仍处于下载状态,然后在完成时进行重命名。