【发布时间】:2020-03-30 10:57:10
【问题描述】:
public string SavePath { get; set; } = @"I:\files\";
public void DownloadList(List<string> list)
{
var rest = ExcludeDownloaded(list);
var result = Parallel.ForEach(rest, link=>
{
Download(link);
});
}
private void Download(string link)
{
using(var net = new System.Net.WebClient())
{
var data = net.DownloadData(link);
var fileName = code to generate unique fileName;
if (File.Exists(fileName))
return;
File.WriteAllBytes(fileName, data);
}
}
var downloader = new DownloaderService();
var links = downloader.GetLinks();
downloader.DownloadList(links);
我猜 Parallel.ForEach() 有问题,但我无法弄清楚。
是否存在内存泄漏,或者发生了什么?
更新 1
改成新代码后
private void Download(string link)
{
using(var net = new System.Net.WebClient())
{
var fileName = code to generate unique fileName;
if (File.Exists(fileName))
return;
var data = net.DownloadFile(link, fileName);
Track theTrack = new Track(fileName);
theTrack.Title = GetCDName();
theTrack.Save();
}
}
在运行 9 小时后,我仍然观察到内存使用量增加,但使用量增长缓慢。
只是想知道,是不是因为我没有释放 theTrack 文件的内存使用?
顺便说一句,我使用ALT package 更新文件元数据,不幸的是,它没有实现 IDisposable 接口。
【问题讨论】:
-
不一定是内存泄漏,可能是垃圾回收器没有运行。
-
File.WriteAllBytes(fileName, data);data你有哪个尺寸的?你试过分块写吗? -
由于您正在并行处理项目,因此您将每个下载文件的内容同时保存在内存中 - 多个文件。这就是它增加的原因,特别是如果它们是大文件。正如@Sean 提到的,GC 很可能还没有清理干净。
-
嗨@PavelAnikhouski 大多数时候,文件将小于1MB,但也可能超过100MB,目前最大的是155MB。怎么分块写?
-
@riQQ DownloadFile() 解决了这个问题。谢谢!
标签: c# multithreading .net-core