【问题标题】:Tasks vs ThreadPool任务与线程池
【发布时间】:2011-11-09 21:10:20
【问题描述】:

我有一个 C# 应用程序,其中列出了要完成的工作。我希望尽可能多地并行完成这些工作。但是我需要能够控制并行任务的最大数量。

据我了解,这可以通过 ThreadPool 或 Tasks 实现。我用哪一个有区别吗?我主要关心的是能够控制一次有多少线程处于活动状态。

【问题讨论】:

  • 您确定需要控制运行的线程数量吗?还是只需要控制正在进行的工作的数量?

标签: c# multithreading parallel-processing task-parallel-library


【解决方案1】:

请查看ParallelOptions.MaxDegreeOfParallelism 以获取Tasks。

我建议您使用 Tasks,因为它们提供了比 ThreadPool 更高级别的抽象。

可以在here 找到有关该主题的非常好的读物。真的,一本必备的书,而且它是免费的:)

【讨论】:

    【解决方案2】:

    在 TPL 中,您可以在 ParallelEnumerableParallelOptions.MaxDegreeOfParallism 上使用 WithDegreeOfParallelism

    如果您只是使用自定义线程或任务,还有CountdownEvent 可能是更好的选择。

    ThreadPool 中,当您使用SetMaxThreads 时,它的全局变量为AppDomain,因此您可能会不必要地限制不相关的代码。

    您不能将工作线程数或 I/O 完成线程数设置为小于计算机中处理器数的数字。

    如果托管公共语言运行时,例如由 Internet 信息服务 (IIS) 或 SQL Server 托管,则主机可以限制或阻止对线程池大小的更改。

    更改线程池中的最大线程数时要小心。虽然您的代码可能会受益,但这些更改可能会对您使用的代码库产生不利影响。

    将线程池大小设置得太大会导致性能问题。如果同时执行的线程过多,任务切换开销就成为一个重要因素。

    我同意另一个答案,即您应该使用 TPL 而不是 ThreadPool,因为它是对多线程的更好抽象,但它可以在两者中实现您想要的。

    【讨论】:

      【解决方案3】:

      在这个article on msdn 中,他们解释了为什么他们推荐使用 Tasks 而不是 ThreadPool 进行并行化。

      【讨论】:

        【解决方案4】:

        任务对我来说有一个非常迷人的功能,你可以构建任务链。这是在之前任务的某些结果上执行的。 我经常使用的一个功能如下:任务 A 在后台运行以执行一些长时间运行的工作。我将任务 B 链接在它之后,仅在任务 A 定期完成并且我将其配置为在前台运行时执行,因此我可以轻松地使用长时间运行的任务 A 的结果更新我的控件。

        【讨论】:

          【解决方案5】:

          您还可以创建一个信号量来控制一次可以执行多少个线程。您可以创建一个新的信号量,并在构造函数中指定有多少并发线程能够一次使用该信号量。由于我不知道您将如何使用线程,因此这是一个很好的起点。

          MSDN Article on the Semaphore class

          -韦斯利

          【讨论】:

            猜你喜欢
            • 2010-12-18
            • 2015-09-14
            • 2012-09-03
            • 2015-07-13
            • 2010-09-07
            • 2012-02-12
            • 2012-12-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多