3

我已经阅读了大量关于服务器应用程序中多线程的动态和影响(饿死 clr 线程池等),但是为了争论,我有确切的 4 个异步进程,我需要完成每个请求我的(asp.net)页面......现在让我们说时间是更关键的元素,我的网站不应该遇到大量流量。在这种情况下,最好使用该new Thread()方法还是生成 4 个线程ThreadPool.QueueUserWorkItem method

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

4

2 回答 2

2

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

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

我会使用线程池并使用SetMinThreads来确保线程立即启动并且总是足够的。

于 2012-08-15T15:58:20.553 回答
1

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

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

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

如果您可以访问 .net 4.0,则可以使用 TPLTask类(它也使用ThreadPool底层),因为它具有更吸引人的特性。

于 2012-08-15T12:45:20.027 回答