代表与BackgroundWorker的差异?

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

BackgroundWorker

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

Delegate

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


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

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

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

我在我的博客上 (从进行后台操作的角度)对BackgroundWorker ,异步代理和其他方法进行了简要比较。

BackgroundWorker具有以下优点:

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

异步代理具有以下优势:

  • 返回一个值是直截了当的; 它刚刚归来。

总之,我建议使用Task而不是BackgroundWorker或异步委托。

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

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

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

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

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

但您可能感兴趣的是何时应该使用异步方法而不是使用后台工作程序。 我对此并没有多少经验,但Anders Hejlsberg在他关于C#未来的PDC会议上谈到了这一点 。

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