伊图教程网[www.etoow.com]
http://www.etoow.com/html/2009-04/1238977119.html
一旦你耗尽内存后会发生什么取决你是在VS.NET环境下运行本程序还是运行本程序的编译版。如果你运行的是本程序的编译版并且没有进行错误处理(error handling),你在程序运行中不会发现错误,它仅仅是在内存耗尽时停止运行。如果你在VS.NET环境下运行代码并且没有进行错误处理,程序将会停止运行并在调试窗口下出现下面的错误信息:
Fatal out of memory error.
The program '[2340] TooMuchData.exe' has exited with code 0 (0x0).
因此,你可能会开始尝试添加一个错误处理函数来检测System.OutOfMemoryException的情况。例如,你可能用一个Try…Catch语句来观察是否出现例外。一个比较通用的方法如下:
Do While TrueTrydaProduct.Fill(myDS, "authors")If myDS.Tables("authors").Rows.Count Mod 100 = 0 ThenDebug.WriteLine(myDS.Tables("authors").Rows.Count.ToString())End IfCatch ex As ExceptionMessageBox.Show("Error: " & ex.Message)End TryLoop
不幸的是,这种方法根本就不工作。在MessageBox.Show语句上设置一个断点,理论上当运行到这个语句上应该出现,但是这一点永远也不会到达。当最终耗尽内存时,调试窗口出现的却是下面的信息:
Fatal out of memory error.
An unhandled exception of type 'System.OutOfMemoryException' occurred in system.data.dll
如果是MessageBox出现该消息情况会好些,但是相反,VS.NET(或者Framework)产生并显示了上述消息,跟踪这个特定的错误并不是有效的解决方法。
如果在本程序中添加错误处理并编译运行它,那么你将得到另外一种结果。这次,你会发现MessageBox报告说程序遇到了一个无法处理的错误,类型为System.OutOfMemoryException,位于system.data.dll。然而,这个MessageBox来自Framework而不是你自己用代码编写的MessageBox。
并不象听起来那么容易
你可以建立一个可以消耗所有可用内存的Dataset,但是消耗的过程并不简单,它需要大量的记录,尤其是大量的时间。Dataset可能需要几个小时才能填满内存,几乎没有什么应用程序可以在这种情况下运行很长时间,这就产生了问题。当然,每台机器的配置都不尽相同,如处理器速度、内存容量以及交换文件大小,但是这种结果的出现都是不受欢迎的。
无论这种结果是如何令人讨厌,错误都应该可以被捕获。不幸的是,我们在这种情况下无法捕获到System.OutOfMemoryException错误,也就是说我们在应用程序中很难处理这种特定错误。
一个无法捕获ADO.NET Dataset的内存错误
'http://www.etoow.com/html/2009-04/1238977119.html