[英]Differences of Delegates vs BackgroundWorker?
谁能解释Delegates和BackgroundWorker之间的区别?在这种情况下,Backgroundworker比Delegate更有效?由于我们有异步委托,因此使用BackGroungWorker的需求是什么。
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
检测取消的结果。 ProgressChanged
和RunWorkerCompleted
事件将同步到调用RunWorkerAsync
时就位的SynchronizationContext
。 异步委托具有以下优点:
总之,我建议使用Task<TResult>
而不是BackgroundWorker
或异步委托。
后台工作程序主要用于UI工作,您需要在后台线程上轻松运行任务并向屏幕提供进度更新。
优点之一是,它可以为您处理对UI线程的回调,因此您无需检查InvokeRequired等。
委托是一种将函数作为参数传递的更通用的机制,通过异步执行它们,可以为您提供在其他线程上运行这些方法的简便方法。
后台工作程序是一种抽象概念,可帮助您在单独的线程上执行操作。
委托实际上并没有启动单独的线程-它们是引用方法的一种。
但是,您可能感兴趣的是何时应该使用异步方法而不是使用后台工作程序。 我对此没有太多经验,但是Anders Hejlsberg在关于C#的未来的PDC会议上谈到了这一点 。
我得到的信息是,在某些情况下,异步方法由于较低的复杂性而更可取。 UI线程仍然会被阻止,但不会持续很长时间,以至于不起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.