【发布时间】:2010-11-22 11:32:50
【问题描述】:
我一直认为,即使在 ASP.NET 中,将 ThreadPool 用于(假设是非关键的)短期后台任务也被认为是最佳实践,但后来我遇到了 this article 这似乎否则建议 - 论点是您应该离开 ThreadPool 来处理与 ASP.NET 相关的请求。
所以到目前为止,我一直在执行小型异步任务:
ThreadPool.QueueUserWorkItem(s => PostLog(logEvent))
而the article 建议改为显式创建一个线程,类似于:
new Thread(() => PostLog(logEvent)){ IsBackground = true }.Start()
第一种方法具有可管理和有界的优点,但有可能(如果文章正确的话)后台任务会与 ASP.NET 请求处理程序竞争线程。第二种方法释放了 ThreadPool,但代价是不受限制,因此可能会占用太多资源。
所以我的问题是,文章中的建议是否正确?
如果您的网站获得了如此多的流量,以至于您的 ThreadPool 已满,那么最好是带外使用,还是完整的 ThreadPool 意味着无论如何您都达到了资源的极限,在在哪种情况下您不应该尝试启动自己的线程?
澄清:我只是在小型非关键异步任务(例如,远程日志记录)的范围内询问,而不是需要单独进程的昂贵工作项(在这些情况下,我同意您需要更强大的解决方案)。
【问题讨论】:
-
情节变厚了 - 我找到了这篇文章 (blogs.msdn.com/nicd/archive/2007/04/16/…),我无法完全解码。一方面,它似乎是说 IIS 6.0+ 总是处理线程池工作线程上的请求(早期版本可能会这样做),但接下来是这样的:“但是,如果你使用新的 .NET 2.0 异步页面 (Async="true") 或 ThreadPool.QueueUserWorkItem(),则处理的异步部分将在 [完成端口线程] 内完成。” 处理的异步部分?
-
另一件事 - 这应该很容易通过检查线程池的可用工作线程是否低于其最大工作线程来测试 IIS 6.0+ 安装(我现在没有)线程,然后在排队的工作项中做同样的事情。
标签: asp.net multithreading threadpool