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