BackgroundWorker和Thread之间的区别?

时间:2011-01-21 09:22:13

标签: .net multithreading

BackgroundWorkerThread之间有什么区别?在我的应用程序中,我使用的是一个定期与数据库通信的消息传递系统。我想在这里使用哪一个:BackgroundWorkerThread

7 个答案:

答案 0 :(得分:21)

BackgroundWorker是WinForms中的一个随时可用的类,允许您在后台线程上执行任务,避免冻结UI,此外还允许您轻松编组主线程上成功回调的执行这使您可以使用结果更新用户界面。它还可以跟踪进度并取消任务。它使用线程池中的线程。

另一方面,Thread是一个允许您在新thread上执行某项任务的类。这是一个更基本的概念。

答案 1 :(得分:9)

虽然BackgroundWorker class不是从Thread类派生的,但是它使您能够比自己创建和调用线程更容易管理工作。

它引发了三个关键事件:

  • DoWork - 在线程开始时引发。
  • ProgressChanged - 提出报告主要UI线程的进度。
  • RunWorkerCompleted - 在线程完成时引发。

通过这些,您可以在致电RunWorkerAsync()以启动它后监控线程正在进行的工作。

答案 2 :(得分:1)

BackgroundWorker已经实现了报告进度,完成和取消的功能 - 因此您不需要自己实现它。 使用Thread可以更好地控制异步进程执行(例如线程优先级或选择前景/后台线程类型)。

有时你不需要进度报告和其他BackgroundWorker东西 - 所以Thread / ThreadPool将是不错的选择。

答案 3 :(得分:1)

BackgroundWorker使用ThreadPool中的线程,使用Thread创建自己的线程。此外,在调用线程的事件报告方面还有一些功能。

答案 4 :(得分:1)

BackgroundWorker是一个线程实现,允许您指定要完成的方法。

它为您提供了一个通信API,允许您停止工作,跟踪进度并以异步方式获得通知。

答案 5 :(得分:1)

使用BackgroundWorker - 无论如何它封装了线程并且更易于使用。它的一个优点是它的api允许更简单的基于事件的模型来报告进度,而且,这些事件调用被正确地路由到UI线程(这样你就不必使用Invoke方法来编组调用)。

答案 6 :(得分:0)

我认为存在很大的不同,那就是当你想在BackgroundWorker调用的方法中使用任何UI组件时,它根本不起作用。我的意思是BackgroundWorker真的是一个后台进程,你无法使用界面操作。例如,如果您在BackgroundWorker调用方法中创建新标签,则肯定会发现错误。