C#System.OutOfMemoryException未处理

C#System.OutOfMemoryException未处理,c#,out-of-memory,C#,Out Of Memory,我使用foreach读取文件夹中的所有图像 string[] filePaths = Directory.GetFiles(Workspace.InputFolder, "*.*"); foreach (string imageFile in filePaths) { // Some Process here, the output are correct, just after output

我使用foreach读取文件夹中的所有图像

        string[] filePaths = Directory.GetFiles(Workspace.InputFolder, "*.*");
        foreach (string imageFile in filePaths)
        {
            // Some Process here, the output are correct, just after output 
               the error happen
        }
但结果是错误的

System.OutOfMemoryException was unhandled
  Message=Out of memory.
  Source=System.Drawing 
问题是由foreach循环在进程完成后继续循环引起的吗? 我应该如何释放内存?
谢谢。

鉴于您的异常情况,您似乎正在处理
系统.Drawing
命名空间中的对象

例如,如果要在foreach循环中打开和操作图像,请确保在使用完图像资源后立即调用
Dispose()
,以释放图像资源。您也可以使用语句将其包装在
中,即:

    foreach (string imageFile in filePaths)
    {
        using (var image = Image.FromFile(imageFile)
        {
            // Use the image...
        } // Image will get disposed correctly here, now.
    }

请注意,可能存在问题的不仅仅是图像,还有实现
IDisposable
的任何资源。
System.Drawing
中的许多类都是一次性的-请确保您可以如上所述(通过使用)访问它们,或者在完成后对它们调用
Dispose()

鉴于您的异常情况,看起来您正在处理
System.Drawing
命名空间中的对象

例如,如果要在foreach循环中打开和操作图像,请确保在使用完图像资源后立即调用
Dispose()
,以释放图像资源。您也可以使用
语句将其包装在
中,即:

    foreach (string imageFile in filePaths)
    {
        using (var image = Image.FromFile(imageFile)
        {
            // Use the image...
        } // Image will get disposed correctly here, now.
    }

请注意,可能存在问题的不仅仅是图像,还有实现
IDisposable
的任何资源。
System.Drawing
中的许多类都是一次性的-请确保您可以如上所述(通过使用)访问它们,或者在完成后调用
Dispose()

这在很大程度上取决于您对每个文件名所做的操作。如果要打开一个文件,请确保在打开后处理()对象。您能描述一下在循环中执行的操作吗?您需要发布更多代码,特别是在foreach循环中执行的操作。我的直觉是,您正在创建一次性对象实例,但没有正确地处理它们,但除非您发布更多代码,否则无法确定。我使用图像进行OCR,将图像转换为数字数据。因此,您发现了内存泄漏的来源。这在很大程度上取决于您对每个文件名所做的操作。如果要打开一个文件,请确保在打开后处理()对象。您能描述一下在循环中执行的操作吗?您需要发布更多代码,特别是在foreach循环中执行的操作。我的直觉是,你正在创建一次性对象实例,但没有正确地处理它们,但除非你发布更多的代码,否则不可能确定。我使用图像进行OCR,将图像转换为数字数据。因此,你找到了内存泄漏的来源。我尝试了你的解决方案,但同样的错误消息出现了,我应该如何调用Dispose()函数?@Xuan您需要在foreach循环中完成对包含Dispose()的所有对象调用
Dispose()
方法。这将包括任何图像,但也可能包括您的OCR类等@ReedCopsey感谢您的帮助,我通过更改。对于特定的图像文件(*.tif).Xuan,仅指定“*.tif”并不能解决根本问题。目前的问题是,您几乎肯定正在使用一次性类型,并且在处理完实例后没有正确地处理它们。我确实尝试了您的解决方案,但出现了相同的错误消息,我应该如何调用Dispose()函数?@Xuan您需要调用
Dispose()
方法,在foreach循环内部,对包含它的所有对象执行该方法。这将包括任何图像,但也可能包括您的OCR类等@ReedCopsey感谢您的帮助,我通过更改。对于特定的图像文件(*.tif).Xuan,仅指定“*.tif”并不能解决根本问题。目前的问题是,几乎可以肯定的是,您使用的是一次性类型,并且在处理完实例后没有正确地处理它们。