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