BackgroundWorker和线程

8
使用哪种方法来完成特定任务都有其优缺点。
这个问题的关键在于何时使用哪一个方法?
非常感谢。
6个回答

12
如果你所说的“Threads”是指显式使用System.Threading.Thread类来创建、配置和启动自己的线程,那么这样做会增加你的工作量,比从线程池中获取线程(其他技术所做的)需要更多的CPU周期,但它能够提供更多的灵活性,因为它允许你指定线程优先级和其他几个特征,而使用线程池线程不会提供这些特性。
当设计时不知道需要多少线程时,“线程池”方法更为适用。线程池最初包含一小部分线程,可以根据需要动态创建新线程,并为你管理未使用线程的创建、协调和删除。有三种机制可以用来访问并使用线程池中的线程:
1.使用Delegate.BeginInvoke()(最常见的技术)
2.使用计时器(有几个变体)
3.System.Threading.ThreadPool提供了几个其他特性(BackGroundWorker类、QueueUserWorkItem()等)。

6
请看这个很棒的线程概述:[The BackgroundWorker]提供以下功能:
  • 一个“取消”标志,用于通知工作者无需使用Abort就可以结束
  • 报告进度、完成和取消的标准协议
  • 实现IComponent,允许在Visual Studio Designer中放置它 工作线程上的异常处理
  • 响应工作进度或完成而更新Windows Forms和WPF控件的能力。
最后两个功能特别有用——这意味着您不必在工作者方法中包含try/catch块,并且可以更新Windows Forms和WPF控件,而无需调用Control.Invoke。

4

当你不需要与UI(WinForms或WPF)一起工作时,请使用线程;当你需要处理UI时,请使用后台工作者。

使用UI和后台工作者可以避免许多问题。


3

我过去常把BackgroundWorker视为Threads的包装器。因此,我会在GUI工作中使用BackgroundWorker,在更专业或肮脏的工作(如Windows服务等)中使用Threads。


1
BackgroundWorker类是一种简单的方式,可以将线程添加到表单以执行一些耗时操作而不会阻塞UI。您可以使用线程完成相同的操作,但需要编写略微更多的代码。

1

BackgroundWorker类简单地提供了事件,这些事件会为你切换到UI线程的上下文,但不要被困扰;DoWork事件(在那里你实际上执行工作)仍然在另一个线程的上下文中执行(因为这是整个过程的重点),在那里执行任何类型的UI交互或更新最好会抛出异常,最坏的情况下会崩溃。当您正在尝试做一些需要UI更新并且其范围不超出表单的内容时,请在表单上使用BackgroundWorker。对于其他后台操作,请考虑使用线程池(用于短期操作)或创建自己的线程。

BackgroundWorker通过ProgressChanged事件提供方便,但不要太舒服并在DoWork中开始进行UI更新。


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