gpt4 book ai didi

.net - 使用线程池和普通线程有什么区别?

转载 作者:行者123 更新时间:2023-12-03 15:21:13 26 4
gpt4 key购买 nike

我正在阅读关于 SO 的随机问题和答案,并遇到了这个问题:

C#, IAsyncResult and the thread pool

问题是使用线程池或使用普通线程的 X 方法。

使用线程池和普通线程有什么区别?

最佳答案

线程池通常适用于短时间运行的任务。它的局限性在于它是一个应用程序范围的有限资源(每个 CPU 25 个),并且有很多内部类使用线程池,因此如果您执行大量长时间运行的任务,您将耗尽所有线程。

对于长时间运行的任务,最好使用手动创建的线程,并将其背景属性设置为 true。

备注 : 在 .NET Framework 2.0 版中,Thread.CurrentPrincipal属性值传播到使用 QueueUserWorkItem 排队的工作线程。方法。在早期版本中,不传播主体信息。

何时不使用线程池线程

有几种场景适合创建和管理自己的线程而不是使用线程池线程:

  • 您需要一个前台线程(!)。
  • 您需要一个线程具有特定的优先级。
  • 您的任务会导致线程长时间阻塞。线程池具有最大线程数,因此大量阻塞的线程池线程可能会阻止任务启动。
  • 您需要将线程放入单线程单元中。所有 ThreadPool 线程都在多线程单元中。
  • 您需要有一个与线程相关联的稳定身份,或者将线程专用于某项任务。

  • 一个很大的区别是线程池线程上的未处理异常终止了进程。 ;除了这三个异常(exception):
  • 一个 ThreadAbortException在线程池线程中被抛出,因为 Abort被称为。
  • 一个 AppDomainUnloadedException被抛出线程池线程,因为正在卸载应用程序域。
  • 公共(public)语言运行时或宿主进程终止线程。

  • 一些很好的引用资料是:

    The Managed Thread Pool

    Threading in C#

    Programming the Thread Pool in the .NET Framework

    更新 : 回应评论。您可以使用 GetAvailableThreads方法来确定在任何给定时间线程池中的实际线程数。 ThreadPool.GetMaxThreads是不同的数量。它是请求排队之前池中允许的最大值,而不是当前池中的实际线程数。

    关于.net - 使用线程池和普通线程有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1058523/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com