何时使用System.Threading.ThreadPool,何时使用众多自定义线程池之一?

7
我正在创建一个用于执行缓慢存储过程的ASP.NET异步处理程序。我认为要在混合负载的快速页面和缓慢页面中获得额外的吞吐量,需要将缓慢页面在与ASP.NET使用的线程池不同的线程池上执行,否则异步模式会导致使用双倍的稀缺线程数量(如果我错了,请纠正我)。
所以我找到了System.Threading.ThreadPool - 看起来它应该可以解决问题,但是...

网络上有各种教程,比如这个使用了自定义池John Skeet's MiscUtils中的一个,以及在异步模式教程中引用的自定义线程池。

System.Threading.ThreadPool从1.1版本就存在了 - 为什么人们经常觉得需要编写全新的线程池呢?我应该避免使用System.Threading.ThreadPool吗?

对于线程,我是一个初学者,请不要使用未定义的术语。

更新。要执行的存储过程不一定是MS-SQL,也不一定能够使用内置的异步方法,如BeginExecuteNonQuery()


1
我的感觉是,你应该使用异步页面来实现这个目标。http://msdn.microsoft.com/en-us/magazine/cc163725.aspx 我认为重新发明线程机制,比如存储过程调用,会适得其反。使用支持的最佳实践是最好的选择。我建议仅在需要它们的特定模式(如COM单元)下使用自定义线程模式。 - Jim
当您的存储过程是I/O绑定时,执行它的线程将用于其他请求,因此您不应该需要使用单独的线程池(而不是ASP.NET)。 - Jim
@Jim,你提到的文章基本上与被接受的答案相符,尤其是最后一段。也就是说,要么使用内置的异步方法(如BeginExecuteNonQuery),这些方法不使用ASP.NET的线程,要么使用新线程/自定义池。 - MatthewMartin
1个回答

3
这里是关于该主题的一些发现。为什么你不应该在ASP.NET中使用ThreadPool,具体内容请看此链接:http://madskristensen.net/post/Done28099t-use-the-ThreadPool-in-ASPNET.aspx。这篇文章相当老了,但我认为情况并没有发生太大改变。如果我有误,请纠正我。

使用System.Threading.ThreadPool或自定义委托并调用其BeginInvoke可以快速启动应用程序中的工作线程。但不幸的是,它们会破坏应用程序的整体性能,因为它们会消耗与ASP.NET处理HTTP请求时相同的线程池中的线程。

使用System.Threading.Thread类带来的自定义线程应该可以解决问题,因为创建的线程不是应用程序池的一部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接