我正在编写一个在.NET 3.5上运行的C#Windows窗体应用程序,并使用Oracle的客户端连接到数据库(我希望我可以升级到.NET 4.0或更高版本,但我不能)。应用程序中有很多代码遵循通常的模式;这是伪代码:
var worker = new BackgroundWorker();
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.RunWorkerAsync();
...
private void worker_DoWork(object sender, DoWorkEventArgs e) {
using(var conn = OpenOracleConnection()) {
e.Result = LoadSomethingFromDatabase(conn);
}
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
DisplayLoadedData(e.Result);
}
到目前为止一切顺利。不幸的是,我最近添加了一些代码,可以非常快速地执行这些查询,尽管只在一个线程上。现在,该应用程序偶尔会出现以下两种行为之一:
"reader.GetInt32(string)"
。我检查过,据我所知,我的网络连接或Oracle数据库本身没有任何问题。我也不是跨线程共享Oracle连接;在worker.DoWork中的代码在ThreadPool的后台线程上运行时,该特定的“conn”实例一次只能从一个线程访问(因为它被声明为在线程上运行的方法中的局部变量)
有没有人对我如何解决这个问题有任何想法,或至少调试它?它曾经发生在其他任何人身上吗?
更新:为了它的价值,我将我的实现切换为每个工作线程使用一个长时间运行的数据库连接,并限制了工作线程的数量。这大大降低了弹出这个问题的频率,但遗憾的是它并没有完全消除这个问题。