使用静态方法System.Drawing.Image.FromFile的C#内存使用量峰值

时间:2017-07-28 21:26:11

标签: c# memory

所以我有一个程序可以将一堆文件加载到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])

2 个答案:

答案 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添加到文件的顶部,而不是完全限定代码中的类型 - 这样可以更清楚地了解您使用的类型。