【问题标题】:multithreading using threadPool or new thread() in server app在服务器应用程序中使用 threadPool 或 new thread() 进行多线程
【发布时间】:2012-08-15 07:46:31
【问题描述】:

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

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

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    如果您可以访问 .net 4.0,则可以使用 TPL Task 类(它还在后台使用 ThreadPool),因为它具有更吸引人的功能。

    【讨论】:

    • 感谢您的回复。是的,我使用的是 .net 4.5,所以我将研究 Task。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    相关资源
    最近更新 更多