1

我使用的是 Windows 2008 R2,CPU 为 100%。我在负责的应用程序池上运行了 DebugDiag,并发现了以下调用堆栈:

System.GC._Collect(Int32, Int32)
OpenAccessRuntime.Relational.conn.RelationalConnectionPool.CleanupLeftOvers(System.Object)
System.Threading.ExecutionContext.runTryCode(System.Object)
System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object)
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
System.Threading.ThreadPoolWorkQueue.Dispatch()
System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

我的问题是我想弄清楚是什么组件产生了这个线程,所以我知道这个线程是来自 Telerik 应用程序,还是由我们的开发人员创建的某个东西控制。

如何确定是什么对象产生了这个线程?

4

1 回答 1

2

该线程由 OpenAccess 运行时产生。

OpenAccess 维护一个具有可配置“最大活动连接”值的连接池 - 默认值为 10。当所有连接都已发出(并行操作)时,下一个请求会阻塞,直到活动连接返回池为止。如果请求被阻塞,后台池管理线程会尝试强制执行垃圾收集以释放可能存在的任何悬空/无效连接。

您是否明确指定了最大活动值?也许您应该根据您的使用情况考虑更高的价值。您是否有访问“context.Connection”但不处置它的地方?

于 2012-10-10T15:46:00.887 回答