【发布时间】:2012-03-03 16:40:35
【问题描述】:
我想看看池中的一个线程何时开始使用以及何时被释放。
我想要探索第三方库的行为,以决定是否应该使用它的异步方法。如果这些方法阻止公共池中的线程,那么使用它们不会为 ASP.NET 应用程序带来任何好处。该库被混淆了,所以我不想用反编译器搜索答案。
【问题讨论】:
标签: asp.net iis logging asynchronous threadpool
我想看看池中的一个线程何时开始使用以及何时被释放。
我想要探索第三方库的行为,以决定是否应该使用它的异步方法。如果这些方法阻止公共池中的线程,那么使用它们不会为 ASP.NET 应用程序带来任何好处。该库被混淆了,所以我不想用反编译器搜索答案。
【问题讨论】:
标签: asp.net iis logging asynchronous threadpool
您提出问题的方式就像您需要一个调试器来监控您的程序。
现在在您的程序中,您知道何时从池中调用线程以及何时释放它 - 不是吗?
如果你不控制程序,你想查看和跟踪其他程序,那么它听起来就像一个通用的调试器。这可以通过使用 c/c++ 和大量代码的钩子函数来完成。
如果您单击池并查看属性,sysinternals 的进程浏览器可以实时为您提供打开的线程。
另一方面,我认为ThreadPool.GetAvailableThreads 可以在您需要的时候为您提供您所要求的信息。
http://msdn.microsoft.com/en-us/library/system.threading.threadpool.getavailablethreads.aspx
如果您可以提供更多信息,说明您真正尝试归档的内容并缩小您的问题范围,从一般调试程序到更有针对性的需求。
【讨论】:
如果您希望有一个事件或某种公共挂钩来告诉您 ThreadPool 线程在做什么,那么很遗憾没有这样的事情。
我能想到另外两种可能有帮助的方法:
首先,您可以在调用库之前和之后检查来自ThreadPool.GetAvailableThreads() 的workerThreads 结果的值。如果值发生变化,库可能是罪魁祸首。这在您只处理单个请求的测试环境中最有可能是有意义的。您还可以将 workerThreads 编号保存在自定义 Windows 性能计数器中,并随着时间的推移对其进行跟踪——也许使用它来比较一种方法与另一种方法。
以下是描述性能计数器方法的文章的链接:
http://msdn.microsoft.com/en-us/library/ff650682.aspx
如果您使用的是 IIS 7+,另一种可能性是将 MaxConcurrentRequestsPerCPU 设置为零来禁用(通过 .NET 4.0+ 中的 HostingEnvironment,或通过 .NET 3.5 或更高版本中的 aspnet.config 文件) , 并将MaxConcurrentThreadsPerCPU 设置为一个相对较小的数字,并使用库中的一个界面与另一个界面来衡量您的应用在负载下的性能。如果请求由于没有足够的线程而排队,响应时间将相应地跳跃。不幸的是,如何执行此操作以及进行哪些测量的详细信息取决于您的库和网络请求的结构。
【讨论】: