C# 如何在创建多个位图时防止内存问题?

C# 如何在创建多个位图时防止内存问题?,c#,.net,64-bit,C#,.net,64 Bit,我需要在短时间内处理许多位图,并使用线程来执行。 现在,我记得处理了所有这些,我没有内存泄漏。通常,我的应用程序会打开几个线程(我控制线程的数量——现在我只同时执行4个),每个线程处理一个大位图,并进行一些额外的图形处理 在我处理之前,一切都正常——比如说,一行最多100个位图。我的应用程序使用opendialog,所以我先打开100个位图,然后我的应用程序会自动处理它们。完成后,我打开下一批100个位图,以此类推(因此在这些批次之间有一个明显的停顿)。这个很好用。应用程序一直处于打开状态。我看

我需要在短时间内处理许多位图,并使用线程来执行。 现在,我记得处理了所有这些,我没有内存泄漏。通常,我的应用程序会打开几个线程(我控制线程的数量——现在我只同时执行4个),每个线程处理一个大位图,并进行一些额外的图形处理

在我处理之前,一切都正常——比如说,一行最多100个位图。我的应用程序使用opendialog,所以我先打开100个位图,然后我的应用程序会自动处理它们。完成后,我打开下一批100个位图,以此类推(因此在这些批次之间有一个明显的停顿)。这个很好用。应用程序一直处于打开状态。我看不到内存泄漏,在处理最后一批后它保持稳定,我可以处理更多

当我在一个批次中选择了300多个位图时,问题就出现了,所以我的应用程序会毫不犹豫地处理所有位图。接近尾声时,我发现GDI+内存不足错误,我的应用程序挂起,占用了1.7GB内存

我的猜测是,系统无法在这么短的时间内释放内存(我的应用程序正在保留更多内存)。可能吗?如何应对?我不想在这个过程中增加一个愚蠢的延迟。我想处理这件事

更新:原因很简单,该应用程序被错误编译为32位,因此只有~2GB可用内存。虽然GC需要时间来释放内存,而应用程序仍在为更多位图保留更多内存,但应用程序已达到限制并挂起

我将应用程序编译为64位,它工作得非常完美。此外,我将控制内存使用,因此它不会像现在这样无人值守。感谢所有提示和有趣的改进点

取决于你所说的“短时间”有多长,你绝对可以看。使用它们可以显著降低RAM内存压力,并且速度不会太慢。但是,正如我首先所说的,这取决于你需要它们的处理速度


因此,我建议您也考虑一下这个选项,衡量一下它是否适合您的需要。

您的应用程序是否编译为32位进程?如果是这样的话,无论机器有多少RAM,都会以2Gb的速度耗尽内存。编译为64位将允许您充分利用所有系统内存,并在RAM开始耗尽时使用交换空间(这当然会降低应用程序的速度,但可能是比抛出内存不足异常更好的解决方案).

如果没有任何代码来查看您是如何处理图像的,则很难讲述有关它的内容。阅读此文…您可能需要使用强制垃圾收集来清理…您并行处理了多少位图?(即,您正在启动多少任务或线程?)。注意:您不需要强制垃圾收集-如果.Net内存不足,它将自动执行垃圾收集。我在线程中处理atm 4位图,但它们在处理时会创建一些额外的位图。我认为正确的答案是我错误地认为我编译了64位版本,而它是32位。这就是程序在消耗约1.5 GB内存时挂起的原因。不管怎样,谢谢你给我所有的提示@用户123_456对您链接的问题,评分最高的答案是:“最好的做法是不要强制进行垃圾收集。”顺便说一句,这是正确的。所以我想你可能误解了它的意思。肖恩·里德——你是对的。我没有注意到64位版本的编译器没有包含在VS的Express版本中,所以我编译了32位版本,应用程序挂起时的内存使用情况确实说明了这一点。我将尝试在64位编译器中编译它,此外,我还将尝试强制垃圾收集器;-)我测试了64位版本-没有任何问题。我有一个峰值在约2GB的内存保留,但然后,所有的图像处理后,内存被释放,应用程序保持稳定。