【发布时间】:2011-12-30 13:31:24
【问题描述】:
我正在为 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()。
【问题讨论】:
-
我的感觉是你应该使用异步页面来实现这一点。 msdn.microsoft.com/en-us/magazine/cc163725.aspx 在我看来,为存储过程调用之类的东西重新发明线程机制将适得其反。最好使用受支持的最佳实践。我建议仅将自定义线程模式用于需要它们的特定模式(如 COM 公寓)。
-
您不需要使用单独的线程池(而不是 ASP.NET),因为当您的存储过程是 I/O 绑定时,执行它的线程将用于其他请求。 stackoverflow.com/questions/3288272/…
-
@Jim 您引用的文章或多或少同意接受的答案,尤其是最后一段。 (即要么使用内置的异步方法,例如 BeginExecuteNonQuery,它不使用 ASP.NET 线程,要么使用新的线程/自定义池)
标签: c# asp.net asynchronous threadpool ihttpasynchandler