繁体   English   中英

代表与BackgroundWorker的区别?

[英]Differences of Delegates vs BackgroundWorker?

谁能解释Delegates和BackgroundWorker之间的区别?在这种情况下,Backgroundworker比Delegate更有效?由于我们有异步委托,因此使用BackGroungWorker的需求是什么。

BackgroundWorker

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

Delegate

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


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

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

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

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

BackgroundWorker具有以下优点:

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

异步委托具有以下优点:

  • 返回值很简单; 它刚刚返回。

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

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

优点之一是,它可以为您处理对UI线程的回调,因此您无需检查InvokeRequired等。

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

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

委托实际上并没有启动单独的线程-它们是引用方法的一种。

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

我得到的信息是,在某些情况下,异步方法由于较低的复杂性而更可取。 UI线程仍然会被阻止,但不会持续很长时间,以至于不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM