gpt4 book ai didi

c# - 线程/线程池或后台 worker

转载 作者:太空狗 更新时间:2023-10-29 22:16:21 25 4
gpt4 key购买 nike

我想知道对于需要大量性能的任务应该使用什么。BackgroundworkerThread 还是 ThreadPool

到目前为止,我一直在使用线程,但我需要提高我的应用程序的速度。

最佳答案

BackgroundWorker 相当于一个线程池线程。它添加 在 UI 线程上运行事件的能力。对于显示进度和使用结果更新 UI 非常有用。所以它的典型用法是在需要完成工作时防止 UI 卡住。性能不是首要目标,异步 运行代码才是。这种模式在后来的 .NET 版本中也通过 Task<> 类和 async/await 关键字巧妙地扩展。

线程池线程对于避免消耗资源很有用。线程是一种昂贵的操作系统对象,您可以创建的线程数量非常有限。一个线程占用 5 个操作系统句柄和 1 兆字节的虚拟内存地址空间。没有 Dispose() 方法来提前释放这些句柄。线程池的存在主要是为了重用线程并确保不会有太多线程处于事件状态。重要的是,只有在工作有限时才使用线程池线程,理想情况下不要超过半秒。而且不经常阻塞。因此,它最适合短时间的工作,而不适合性能至关重要的任何事情。处理 I/O 完成是 TP 线程的理想任务。

是的,也可以使用线程来提高程序的性能。您可以通过使用 Thread 或使用 TaskContinuationOptions.LongRunning 的 Task<> 来实现。实际获得性能改进有一些硬性要求,它们非常严格:

  • 您需要多个 线程。在理想情况下,两个线程可以将完成工作所需的时间减半。越少,您使用的线程越多。接近这个理想是多么困难,它不会无限扩展。谷歌“阿姆达尔定律”获取信息。
  • 您需要一台配备多核处理器的机器。这些天很容易得到。您创建的线程数不应超过可用核心数。使用更多通常会降低性能。
  • 您需要那种受计算限制的工作,让处理器的执行引擎成为受限资源。这很常见,但肯定不是灌篮高手。许多作业实际上受到 I/O 吞吐量的限制,例如从文件读取或数据库查询。或者受限于处理器从 RAM 中读取数据的速率。此类作业不会从线程中获益,您将拥有多个可用的执行引擎,但您仍然只有一个磁盘和一个内存总线。
  • 您需要一种算法,可以在几乎不需要同步的情况下跨多个线程分配工作。这通常是需要解决的棘手问题,许多算法在本质上是非常顺序的,不容易并行化。
  • 您需要时间和耐心才能使代码稳定且性能良好。编写线程代码困难,每个月一次使您的程序崩溃或偶尔产生无效结果的线程竞赛可能会浪费大量时间。

关于c# - 线程/线程池或后台 worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17008550/

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