【发布时间】:2013-06-05 04:53:33
【问题描述】:
我想知道在需要大量性能的任务中使用什么。
Backgroundworker、Thread 或 ThreadPool?
到目前为止,我一直在使用 Threads,但我需要提高应用程序的速度。
【问题讨论】:
-
这取决于如何使用它们而不是使用什么。
标签: c# multithreading performance backgroundworker threadpool
我想知道在需要大量性能的任务中使用什么。
Backgroundworker、Thread 或 ThreadPool?
到目前为止,我一直在使用 Threads,但我需要提高应用程序的速度。
【问题讨论】:
标签: c# multithreading performance backgroundworker threadpool
在线程中启动 CPU 密集型任务的框架与您的问题无关,除非您有过于小粒度的子任务。
当您有多个 CPU 时,您需要将您的工作拆分为可以并行执行的子任务。
【讨论】:
这个选择并不重要。 BackgroundWorker 是一个 ThreadPool 线程,所以无论如何都没有区别。但是,您可以尝试使用 ThreadPool.SetMaxThreads 优化线程数。
您可能希望使用有助于优化并行执行的 System.Threading.Task 类。
【讨论】:
BackgroundWorker 与线程池线程是一回事。它添加了在 UI 线程上运行事件的能力。对于显示进度和使用结果更新 UI 非常有用。因此,它的典型用法是防止 UI 在需要完成工作时冻结。性能不是首要目标,异步运行代码才是。在以后的 .NET 版本中,Task 类和 async/await 关键字也巧妙地扩展了这种模式。
线程池线程对于避免消耗资源很有用。线程是一个昂贵的操作系统对象,您可以创建的数量非常有限。一个线程需要 5 个操作系统句柄和 1 兆字节的虚拟内存地址空间。没有 Dispose() 方法可以提前释放这些句柄。线程池的存在主要是为了重用线程并确保没有太多线程处于活动状态。重要的是,仅当它所做的工作受到限制时才使用线程池线程,理想情况下不超过半秒。并且不经常阻塞。因此,它最适合短时间的工作,而不是性能重要的任何事情。处理 I/O 完成是 TP 线程的理想任务。
是的,也可以使用线程来提高程序的性能。您可以通过使用 Thread 或使用 TaskContinuationOptions.LongRunning 的 Task 来实现。实际获得性能改进有一些硬性要求,它们非常严格:
【讨论】:
Thread 或 Task)。这是因为它比线程/任务慢,还是与内存有关,还是因为它使系统陷入困境,或者是其他问题?让我们假设一个令人尴尬的并行问题,大约有 4-20 个内核/线程(物理内核要匹配),而问题可能需要几分钟才能解决。