BackgroundWorker和Threads

Ana*_*hah 8 c# multithreading backgroundworker

使用这两者来实现特定任务的利弊是什么.

百万美元的问题是哪一个使用什么时候?

非常感谢.

Cha*_*ana 12

如果通过"Threads"意味着明确使用System.Threading.Thread类来创建,配置和启动自己的线程,那么答案是这样做更多的工作就在你身上,涉及更多的cpu周期而不仅仅是拉线程来自线程池,(这是其他技术所做的),但它为您提供了更大的灵活性,因为它允许您指定线程优先级,以及使用线程池线程无法承受的其他一些特性.

当在设计时不知道所需的线程数时,"线程池"方法更合适.该池最初包含少量线程,"准备好"供您调用.它可以根据需要动态创建新线程,并为您管理未使用线程的创建,协调和删除.您可以使用三种机制来访问和使用池中的线程.

  1. 使用Delegate.BeginInvoke()(最常用的技术)
  2. 使用计时器(几种变体)
  3. System.Threading.ThreadPool提供了其他几个功能(BackGroundWorker类,QueueUserWorkItem()等).


tan*_*ius 6

看看这个伟大的线程概述:

[BackgroundWorker]提供以下功能:

  • 一个"取消"标志,用于指示工作人员在不使用Abort的情况下结束

  • 报告进度,完成和取消的标准协议

  • IComponent的一个实现,允许它位于工作线程上的Visual Studio Designer异常处理中

  • 能够更新Windows窗体和WPF控件以响应工作进度或完成.

最后两个特性特别有用 - 它意味着您不必在worker方法中包含try/catch块,并且可以更新Windows窗体和WPF控件而无需调用Control.Invoke.


Jho*_*re- 3

我习惯将BackgroundWorker 关联为Threads 功能的包装器。因此,我在 GUI 工作上使用 BackgroundWorker,在更专业或肮脏的工作(Windows 服务等)上使用 Threads