在服务器应用程序中使用threadPool或新线程()进行多线程处理

时间:2012-08-15 07:46:31

标签: c# asp.net .net multithreading iis

我已经对服务器应用程序中的多线程的动态和含义进行了大量阅读(使clr线程池处于饥饿状态等),但是为了论证的缘故,我说我确实需要完成4个异步进程根据我的(asp.net)页面的请求...现在让我们说时间是更关键的元素,我的网站不应该遇到大量流量。在这种情况下,是否最好使用new Thread()方法或ThreadPool.QueueUserWorkItem method生成4个线程?

我的担心(我的观点)是使用ThreadPool method,它可能会创建一个比我真正想要的太大的线程池?当我只需要4个线程时,我不能自己生成它们以保持分配的app域数,clr线程最小吗?

2 个答案:

答案 0 :(得分:2)

产生线程是一种非常昂贵且因此高延迟的操作。如果您想自己管理线程,这是合理的但不是必需的,您必须构建一个自定义池。

使用线程池工作项并非没有危险,因为它不能保证你的并发级别为4.如果你碰巧得到2或3,你的HTTP请求会有更多的延迟。

我使用线程池并使用SetMinThreads来确保线程无延迟地启动并且总是足够。

答案 1 :(得分:1)

我肯定会选择ThreadPool方法。它专为这种情况而设计。线程池将在内部管理所需的线程数,确保不会使系统负担过重。引自MSDN

  

线程池提供新的工作线程或I / O完成线程   按需提供,直到达到每个类别的最低要求。当一个   达到最小值,线程池可以创建其他线程   该类别或等到某些任务完成。从...开始   在.NET Framework 4中,线程池创建并销毁工作线程   为了优化吞吐量,定义为数量   每单位时间完成的任务。太少的线程可能不会   最佳使用可用资源,而太多线程可以   增加资源争用。

如果您真的偏执,可以使用SetMaxThreads手动限制它。使用手动线程管理只会引入潜在的错误。

如果您有权访问.net 4.0,则可以使用TPL Task类(它也使用引擎盖下的ThreadPool),因为它具有更吸引人的功能。