运行代码时,我遇到了看似随机的“系统资源超出”异常。我的程序背后的想法是第三方软件不断地将数据写入 Microsoft Access 数据库文件 (.res) -大约每30秒一次我的代码从该文件读取数据,对其进行一些操作,并将结果写入我们的数据库。不幸的是,我无法更改第三方软件将数据写入文件的方式,我只能使用 Access 数据文件。
此错误既发生在运行通过 Click-Once 发布安装的 WinForms 程序的生产系统上,也发生在我的开发系统上的控制台测试程序中。即使运行返回单个整数的查询并且没有其他程序或线程接触位于本地磁盘上的文件,我也会遇到异常。
异常信息:
System.Data.OleDb.OleDbException (0x80004005): System resource exceeded.
at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
at System.Data.OleDb.OleDbCommand.ExecuteScalar()
...
重现问题的示例代码:
string connectionString = @"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\datafile.res";
string commandText = "SELECT MIN(Data_Point) FROM Channel_Normal_Table WHERE Test_ID = 1";
int connectionCounter = 0;
object result;
while (true)
{
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
connection.Open();
connectionCounter++;
using (OleDbCommand command = new OleDbCommand(commandText, connection))
{
result = command.ExecuteScalar();
}
connection.Close();
}
}
不幸的是,该异常不是确定性的 - 我已经看到它发生在具有相同代码的同一文件上从第 4 个命令执行到第 6149 个命令执行的任何位置。它总是出现在 command.ExecuteScalar() 行上。如果这段代码有资源泄漏,请帮我找出来。
我尝试安装在以下位置找到的修补程序http://support.microsoft.com/kb/2760394(并进行了所需的注册表更改),但这并不能解决问题。任何建议都将受到赞赏并积极寻求。
它在 Windows 7、C# 4.0(控制台和 WinForms)、4 GB RAM 上运行