所以我有一个程序可以将一堆文件加载到listview中以准备上传。当我加载600张照片进行压力测试并检查响应时间时,我恰好打开了TaskManager。当记忆飙升到超过1.2演出时,我感到震惊。我有一个小助手类,验证文件实际上是图片,这是导致尖峰的原因。如果我不调用该方法,则内存使用量是不变的。不知道为什么会这样。
我目前使用后台工作程序加载文件,然后更新绑定到列表视图的可观察集合。
c
在上面的片段中,我调用辅助方法 // Select File Populate worker:
// ------------------------------------------------------------------------------------
private void select_file_populate_Start(object sender, DoWorkEventArgs e)
{
.
.
.
// For each file selected, it will add it to the listview form.
for (int i = 0; i < Selected_Files.Length; i++)
{
// This makes sure the same form is not add to the list again.
bool duplicate = false;
// Enumerates through the observable collection to see if there is a match for the file path.
foreach (FileData entry in Selected_Files_Data)
{
if (entry.Path == Selected_Files[i])
{
duplicate = true;
}
}
// If the file is not a duplicate this will check the validity of the file.
if (duplicate == false && Tools.validate_image(Selected_Files[i]))
{
Selected_Files_Buffer.Add(Selected_Files[i]);
}
}
.
.
.
}
来验证文件实际上是一张照片。
以下是代码:
Tools.validate_image(Selected_Files[i])
答案 0 :(得分:1)
.NET是一个托管环境,这意味着在.NET垃圾收集器启动之前,未引用的对象将保留在内存中。因此,在发生这种情况之前,内存使用量肯定会飙升。
GC要么自动启动(通常不要太频繁),要么手动触发,你可以这样做:
System.GC.Collect();
我建议不要经常这样做,因为它可能会影响性能。什么是'太频繁'取决于你的情况。尝试每10,50或100个文件处理一次,同时检查最大内存使用量和总花费的CPU时间。
答案 1 :(得分:1)
一旦完成图像,您应该Dispose
图像,在您的情况下,您确定了格式。我会改变
System.Drawing.Imaging.ImageFormat file_format = System.Drawing.Image.FromFile(filename).RawFormat;
到
System.Drawing.Imaging.ImageFormat file_format
using(var image = System.Drawing.Image.FromFile(filename))
{
file_format = image.RawFormat;
} // the image will be disposed here, even if an exception is thrown.
我还建议将using System.Drawing
添加到文件的顶部,而不是完全限定代码中的类型 - 这样可以更清楚地了解您使用的类型。