代表与BackgroundWorker的差异?

时间:2010-12-22 12:56:22

标签: c# delegates backgroundworker

任何人都可以解释委托和BackgroundWorker之间的区别吗?在哪种情况下,Backgroundworker比Delegate更有效?因为我们有异步委托,所以需要使用BackGroungWorker。

4 个答案:

答案 0 :(得分:9)

BackgroundWorker

  

BackgroundWorker类允许您在单独的专用线程上运行操作。

Delegate

  

委托是定义方法签名的类型。 ...委托用于将方法作为参数传递给其他方法。


使用哪一个与效率无关的问题。

BackgroundWorker是一个简化了线程处理的包装器,您也可以使用异步委托,但正确管理它们要困难得多。或者,来自MSDN:

  

当您需要响应式用户界面并且您遇到与此类操作相关的长时间延迟时,BackgroundWorker类提供了一种方便的解决方案。

答案 1 :(得分:4)

我对BackgroundWorker,异步委托和其他方法on my blog进行了简要比较(从后台操作的角度来看)。

BackgroundWorker具有以下优势:

  • 进度报告很简单。 BackgroundWorker属性为true的任何WorkerSupportsProgress都可以报告进度。 DoWork委托可以调用ReportProgress,这会导致ProgressChanged事件触发。
  • 有一个内置的合作取消系统。取消线程首先调用BackgroundWorker.CancelAsync。这会导致BackgroundWorker.CancellationPending属性变为true。 DoWork委托应该监视该属性(定期检查它),并将DoWorkEventArgs.Cancel设置为true,如果操作被取消则返回。 RunWorkerCompleted委托通过选中RunWorkerCompletedEventArgs.Cancelled
  • 来检测取消的结果
  • 同步是自动的,包括完成指示和进度报告。 ProgressChangedRunWorkerCompleted个事件会与SynchronizationContext被调用时的RunWorkerAsync同步。

异步代理具有以下优势:

  • 返回一个值很简单;它刚刚归来。

总之,我建议使用Task<TResult>代替BackgroundWorker或异步代理。

答案 2 :(得分:2)

后台工作程序主要用于UI工作,您需要在后台线程上轻松运行任务并向屏幕提供进度更新。

一个优点是它为你调整了它对UI线程的回调,所以你不需要检查InvokeRequired等。

委托是一种更通用的机制,用于将函数作为参数传递,并且通过异步执行它们,它们为您提供了在另一个线程上运行这些方法的简便方法。

答案 3 :(得分:1)

后台工作程序是一个抽象,可以帮助您在单独的线程上执行操作。

代理并不真正启动单独的线程 - 它们是用于引用方法的类型。

但您可能感兴趣的是何时应该使用异步方法而不是使用后台工作程序。我对此没有多少经验,但Anders Hejlsberg talked about it some in his PDC session on the Future of C#

我得到的信息是,在某些情况下,异步方法会更好,因为复杂性较低。 UI线程仍然会被阻止,但不会太长,以至于它很重要。