.NET 5.6.1任务基于并行库的应用程序停止了对NpgsqlConnection.Open()的NpSql.dll 3.1.6调用的响应。
经过进一步调查,似乎有100多个为特定连接字符串服务的线程正在Monitor.Enter信号上等待。等待线程的调用栈与此相同:
[GCFrame: 000000cd8922cec8]
[GCFrame: 000000cd8922d0f0]
[HelperMethodFrame: 000000cd8922d128] System.Threading.Monitor.Enter(System.Object)
Npgsql.ConnectorPool.Allocate(Npgsql.NpgsqlConnection, Npgsql.NpgsqlTimeout)
Npgsql.NpgsqlConnection.OpenInternal()
锁转储指出了孤立的锁问题:MonitorHeld值等于1个所有者+ 546个服务员(1 + 546 * 2 = 1093),而锁所有者线程已死(线程为0)
Index SyncBlock MonitorHeld Owning Thread Info Owner
220427 000000d26dd7b028 1093 1 0 XXX Npgsql.ConnectorPool
在ConnectorPool.Allocate()的不安全代码块内部没有生成任何有助于解释孤立锁的异常。
也没有理由相信我们的代码也导致线程过早死亡:我们在应用程序中的任何地方都没有显式调用Thread.Abort()。
在这一点上,我们没有想法了。
感谢您查看这个。
最佳答案
更新:
结论:从NpSql 3.1.6升级到3.1.7解决了ConnectorPool.Allocate()中的死锁。
关于c# - NpgsqlConnection.Open在对Monitor.Enter的Npgsql.ConnectorPool.Allocate()调用中被阻止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39167187/