代表与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
检测取消的结果。 - 对于完成指示和进度报告,同步是自动的。
ProgressChanged
和RunWorkerCompleted
事件将同步到调用RunWorkerAsync
所使用的SynchronizationContext
。
异步代理具有以下优势:
- 返回一个值是直截了当的; 它刚刚归来。
总之,我建议使用Task
而不是BackgroundWorker
或异步委托。
后台工作程序主要用于UI工作,您需要在后台线程上轻松运行任务并向屏幕提供进度更新。
一个优点是它为你的UI线程编组回调,所以你不需要检查InvokeRequired等。
委托是一种更通用的机制,用于将函数作为参数传递,并通过异步执行它们,它们为您提供了在另一个线程上运行这些方法的简便方法。
后台工作程序是一个抽象,以帮助您在单独的线程上执行操作。
代理并不真正启动单独的线程 – 它们是用于引用方法的类型。
但您可能感兴趣的是何时应该使用异步方法而不是使用后台工作程序。 我对此并没有多少经验,但Anders Hejlsberg在他关于C#未来的PDC会议上谈到了这一点 。
我得到的信息是,在某些情况下,异步方法会更好,因为复杂性较低。 UI线程仍然会被阻止,但不是很长,以至于它很重要。