【问题标题】:When to use System.Threading.ThreadPool and when one of the many custom thread pools?何时使用 System.Threading.ThreadPool 以及何时使用众多自定义线程池之一?
【发布时间】:2011-12-30 13:31:24
【问题描述】:

我正在为 ASP.NET 创建一个异步处理程序,它将执行一个缓慢的存储过程。我想我明白,要在混合加载慢速页面和快速页面时获得额外的吞吐量,需要在 与 ASP.NET 使用的线程池分开的线程池上执行慢速页面,否则异步模式将导致使用的稀缺线程数量增加一倍(如果我错了,请纠正我)。

所以我找到了System.Threading.ThreadPool - 看起来应该可以解决问题,但是...

网上各种教程如this one使用了这个custom poolJohn 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


【解决方案1】:

这是我在该主题上找到的内容。为什么不应该在 ASP.NET http://madskristensen.net/post/Done28099t-use-the-ThreadPool-in-ASPNET.aspx 中使用 ThreadPool。它已经很老了,但我认为它没有太大变化。如果我错了,请纠正我。

使用 System.Threading.ThreadPool 或自定义委托并调用其 BeginInvoke 提供了一种为您的应用程序启动工作线程的快速方法。但不幸的是,它们会损害应用程序的整体性能,因为它们使用 ASP.NET 用于处理 HTTP 请求的同一池中的线程。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    相关资源
    最近更新 更多