我想使用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。 所以我搜索了这个问题,但我没有找到一个存储数据的解决方案,直到下载完整的文件。 我需要这个,因为我必须稍后处理这些文件,如果我有损坏的数据,就像我关闭应用程序,我可以将它们扔进垃圾桶。
是否有一种简单的方法可以运行类似的代码来保证数据的完整性?
答案 0 :(得分:0)
Task Parallel Library (TPL)提供的Task
课程可能会更幸运。下面是一个可能的解决方案的简短模拟。您显然需要实例化下载数据时使用的变量,例如LocalPath
和PathOnWebserver
。
// 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
来执行此方法,而文件仍处于下载状态,然后在完成时进行重命名。