1

我遇到了一个非常烦人的问题。我正在尝试编写一个简单的 WinForm 应用程序来显示 Oracle Coherence 缓存的内容。

出于某种原因LockRecursionException,我打电话时会抛出a CacheFactory.GetCache("cacheName")

在持有读锁的情况下可能无法获取写锁。这种模式很容易出现死锁。请确保在获取写锁之前释放读锁。如果需要升级,请使用升级锁代替读锁。

堆栈跟踪是:

at System.Threading.ReaderWriterLockSlim.TryEnterWriteLockCore(Int32 millisecondsTimeout)   
at System.Threading.ReaderWriterLockSlim.TryEnterWriteLock(Int32 millisecondsTimeout)  
at Tangosol.Util.ThreadGateSlim.Close(Int64 millis) in c:\hudson\workspace\Coh-NET-3.7.1\dev\release.net\coherence-net-v3.7.1\src\Coherence\Util\ThreadGateSlim.cs:line 26

我已将以下代码以及按钮单击事件处理程序放在表单构造函数中,但仍然抛出异常。之前没有调用任何其他内容:

using (var cache = CacheFactory.GetCache("cacheName"))
{
    ...get data from cache
}

有没有人遇到过这个?我正在使用 .Net 4.0 和 Coherence 3.7.1.5。相同的代码在单独的(更复杂的项目)中运行良好,所以我有点不确定出了什么问题。

4

1 回答 1

2

我建议在发生这种情况时查看所有线程。例如,我想知道在调用表单构造函数的线程中是否有一些东西在调用 Coherence。

- 更新 -

来自 Patrick Fry(此功能领域的首席工程师):

这个 Coherence + .NET 4.0 问题已在 Coherence for .NET 3.7.1.7 中通过修复 COH-8044 得到解决。JIRA 没有具体提及锁定问题,但有一个专门针对此问题提交的错误,并且它被复制了的 COH-8044。

https://bug.oraclecorp.com/pls/bug/webbug_print.show?c_rptno=14732333

我们应该在 3.7.1.7 的补丁自述文件中提到这个特定问题也已修复。

于 2013-08-13T13:39:34.147 回答