使用两者来完成给定任务的优点和缺点是什么。
百万美元的问题是使用哪一个以及何时使用?
非常感谢。
如果您所说的“线程”是指明确使用 System.Threading.Thread 类来创建、配置和启动您自己的线程,那么答案是您需要做更多的工作,涉及更多的 CPU 周期,而不仅仅是拉线程来自线程池,(这是其他技术所做的),但它为您提供了更大的灵活性,因为它允许您指定线程优先级,以及使用线程池线程无法提供的其他几个特性。
当所需的线程数在设计时未知时,“线程池”方法更合适。池最初包含少量线程,“准备好”供您调用它们。它可以按需动态创建新线程,并为您管理未使用线程的创建、协调和删除。您可以使用三种机制来访问和使用池中的线程。
看看这个很棒的线程概述:
[BackgroundWorker] 提供以下功能:
一个“取消”标志,用于指示工作人员在不使用 Abort 的情况下结束
用于报告进度、完成和取消的标准协议
IComponent 的实现,允许它位于工作线程上的 Visual Studio 设计器异常处理中
能够更新 Windows 窗体和 WPF 控件以响应工作进程或完成。
最后两个功能特别有用——这意味着您不必在工作方法中包含 try/catch 块,并且无需调用 Control.Invoke 即可更新 Windows 窗体和 WPF 控件。
仅当您不必使用 UI(WinForms 或 WPF)时才使用线程,而当您必须处理 UI 时才使用后台工作人员。
您避免了UI 和后台工作人员的许多问题。
我曾经将 BackgroundWorker 关联为 Threads 的包装器。所以我在 GUI 工作上使用 BackgroundWorker,在更专业或肮脏的工作(Windows 服务等)上使用线程
BackgroundWorker 类是一种向窗体添加线程以执行一些繁重操作而不阻塞 UI 的简单方法。你可以用线程做同样的事情,但编码要多一些。
BackgroundWorker 类只是为您提供切换到 UI 线程上下文的事件,但不要混淆;DoWork 事件(实际上是你做工作的地方)仍然在另一个线程的上下文中执行(因为这是整个事情的重点)并且在那里执行任何类型的 UI 交互或更新都会引发异常最好的,最坏的情况下崩溃。当您尝试执行需要更新 UI 并且其范围不超出表单范围的事情时,应在表单上使用 BackgroundWorker。对于其他后台操作,请考虑使用 ThreadPool(用于短期操作)或创建自己的 Thread。
BackgroundWorker 为 ProgressChanged 事件提供了便利,但不要太舒服并开始在 DoWork 中进行 UI 更新。