BackgroundWorker和Thread有什么不同?

14

BackgroundWorkerThread有什么区别?我在我的应用程序中使用了一个与数据库进行定期通信的消息系统。在这种情况下,我应该使用哪个: BackgroundWorker还是Thread

7个回答

24
一个BackgroundWorker是WinForms中一个可直接使用的类,允许您在后台线程上执行任务,避免冻结用户界面(UI),并且还允许您轻松地将成功回调的执行代理到主线程上,从而使您有可能使用结果更新用户界面。它还提供了跟踪进度和取消任务的可能性。它使用来自线程池的线程。
另一方面,Thread是一个类,允许您在新的线程上执行某些任务。这是一个更基本的概念。

BackgroundWorker是WinForms中可直接使用的类。不仅限于WinForm,同样适用于WPF和Console。 - Yousha Aleayoub

10

BackgroundWorker虽然没有从 Thread 类继承,但它可以比自己创建和调用线程更轻松地管理线程所做的工作。

它引发三个关键事件:

  • DoWork - 在线程启动时引发。
  • ProgressChanged - 引发以向主 UI 线程报告进度。
  • RunWorkerCompleted - 在线程完成后引发。

使用这些事件,您可以在调用 RunWorkerAsync() 启动线程后监视线程正在执行的工作。


1

BackgroundWorker已经实现了报告进度、完成和取消的功能,因此您不需要自己实现它。

使用Thread可以更好地控制异步进程的执行(例如线程优先级或选择前台/后台线程类型)。

顺便说一句,有时您不需要进度报告和其他BackgroundWorker功能 - 因此Thread / ThreadPool将是很好的替代方案。


1

BackgroundWorker 使用线程池中的线程,而使用 Thread 则可以创建自己的线程。此外,在事件报告方面也提供了一些便利,以便向调用线程报告事件。


1
BackgroundWorker是一种线程实现,允许您分配一个方法来完成任务。
它提供了一个通信API,使您能够停止工作、跟踪进度并异步地得到通知。

1
使用BackgroundWorker - 它封装了线程并且更容易使用。其中一个优点是它的API允许更简单的基于事件的模型来报告进度,而且这些事件调用会被正确地路由到UI线程(这样您就不必使用Invoke方法进行调用)。

0

我认为有一个很大的区别,那就是当你想在被BackgroundWorker调用的方法中使用任何UI组件时,它根本不起作用。我的意思是BackgroundWorker实际上是一个后台进程,你将无法使用界面操作。例如,如果你在方法中创建一个新的标签,该方法将由BackgroundWorker调用,你肯定会遇到错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接