我已经对服务器应用程序中的多线程的动态和含义进行了大量阅读(使clr线程池处于饥饿状态等),但是为了论证的缘故,我说我确实需要完成4个异步进程根据我的(asp.net)页面的请求...现在让我们说时间是更关键的元素,我的网站不应该遇到大量流量。在这种情况下,是否最好使用new Thread()
方法或ThreadPool.QueueUserWorkItem method
生成4个线程?
我的担心(我的观点)是使用ThreadPool method
,它可能会创建一个比我真正想要的太大的线程池?当我只需要4个线程时,我不能自己生成它们以保持分配的app域数,clr线程最小吗?
答案 0 :(得分:2)
产生线程是一种非常昂贵且因此高延迟的操作。如果您想自己管理线程,这是合理的但不是必需的,您必须构建一个自定义池。
使用线程池工作项并非没有危险,因为它不能保证你的并发级别为4.如果你碰巧得到2或3,你的HTTP请求会有更多的延迟。
我使用线程池并使用SetMinThreads
来确保线程无延迟地启动并且总是足够。
答案 1 :(得分:1)
我肯定会选择ThreadPool
方法。它专为这种情况而设计。线程池将在内部管理所需的线程数,确保不会使系统负担过重。引自MSDN:
线程池提供新的工作线程或I / O完成线程 按需提供,直到达到每个类别的最低要求。当一个 达到最小值,线程池可以创建其他线程 该类别或等到某些任务完成。从...开始 在.NET Framework 4中,线程池创建并销毁工作线程 为了优化吞吐量,定义为数量 每单位时间完成的任务。太少的线程可能不会 最佳使用可用资源,而太多线程可以 增加资源争用。
如果您真的偏执,可以使用SetMaxThreads
手动限制它。使用手动线程管理只会引入潜在的错误。
如果您有权访问.net 4.0,则可以使用TPL Task
类(它也使用引擎盖下的ThreadPool
),因为它具有更吸引人的功能。