C# Oracle客户端锁定或崩溃

C# Oracle客户端锁定或崩溃,c#,.net,database,oracle,crash,C#,.net,Database,Oracle,Crash,我正在编写一个运行在.NET 3.5上的C#Windows窗体应用程序,并使用Oracle的客户端连接到数据库(我希望我可以升级到.NET 4.0或更高版本,但我不能)。应用程序中有很多代码遵循通常的模式;这里是伪代码: var worker = new BackgroundWorker(); worker.DoWork += worker_DoWork; worker.RunWorkerCompleted += worker_RunWorkerCompleted; worker.RunWork

我正在编写一个运行在.NET 3.5上的C#Windows窗体应用程序,并使用Oracle的客户端连接到数据库(我希望我可以升级到.NET 4.0或更高版本,但我不能)。应用程序中有很多代码遵循通常的模式;这里是伪代码:

var worker = new BackgroundWorker();
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.RunWorkerAsync();

到目前为止还不错。不幸的是,我最近添加了一些代码,可以非常快速地执行此类查询,尽管只在单个线程上执行。现在,应用程序偶尔会表现出以下两种行为之一:

  • 它锁定在Oracle代码中的某个地方,使用完全无害的方法,例如
    “reader.GetInt32(string)”
  • 它使整个CLR崩溃。没有例外,我可以抓住;整个过程瞬间死亡。在事件查看器中,Oracle的DLL被列为故障模块
我检查过了,据我所知,我的网络连接或Oracle DB本身没有问题。我也不在线程之间共享我的Oracle连接;当worker.DoWork中的代码在线程池的后台线程上运行时,该特定的“conn”实例一次只能从单个线程访问(因为它在线程上运行的方法中声明为局部变量)

有人对我如何解决这个问题,或者至少调试它有什么想法吗?这曾经发生在其他人身上吗


更新:为了实现它的价值,我改变了我的实现,为每个工作线程使用一个长时间运行的DB连接,并限制了工作线程的数量。这大大降低了出现此问题的频率,但遗憾的是,它并没有完全消除此问题。

正确,但我不会跨线程共享“conn”的实例;它在自己的线程中运行,然后被处理。我在这里感到困惑,你是否使用BackgroundWorker?我编辑了这个问题,希望能澄清我的意思。这是一个很好的观点,尽管我只是为了简洁而用lambda格式写的;在我的实际代码中,我传递了一个实例方法。不过,我忘了捕获规则。我将编辑问题以反映这一点。您是否获得RunWorkerCompleted上的异常?如果是这样的话,您是否可能在LoadSomethingFromDatabase方法中懒洋洋地加载一些数据?你看到的错误是什么?在异步和已完成的实现中添加一些异常处理
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);
}