我正在为ASP.NET创建一个异步处理程序,它将执行一个缓慢的存储过程。我想我理解为了在慢速和快速页面的混合加载上获得额外的吞吐量,慢速页面需要在与ASP.NET使用的线程池不同的线程池上执行,否则为异步模式将导致使用稀疏线程的数量加倍(如果我错了,请纠正我)。
所以我找到了System.Threading.ThreadPool
- 看起来应该可以做到这一点,但是......
网络上的各种教程,例如this one使用此custom pool,John Skeet's MiscUtils中的一个,以及此tutorial about async patterns中引用的自定义线程池。
System.Threading.ThreadPool
自1.1以来就已经存在 - 为什么人们经常觉得有必要写一个全新的?我应该避免使用System.Threading.ThreadPool
吗?
在涉及线程时,我是初学者,所以在未定义的术语上轻松一点。
更新即可。要执行的存储过程不一定是MS-SQL,也不一定能使用内置的异步方法,例如BeginExecuteNonQuery()
。
答案 0 :(得分:3)
这是我在这个主题上发现的。为什么不在ASP.NET http://madskristensen.net/post/Done28099t-use-the-ThreadPool-in-ASPNET.aspx中使用ThreadPool。它已经很老了,但我认为它没有那么大的变化。如果我错了,请纠正我。
使用System.Threading.ThreadPool或自定义委托并调用其BeginInvoke提供了一种快速方法来为您的应用程序启动工作线程。但不幸的是,它们损害了应用程序的整体性能,因为它们使用ASP.NET使用的相同池中的线程来处理HTTP请求。
在System.Threading.Thread类的帮助下使用自定义线程应解决问题,因为创建的线程不是应用程序池的一部分。